angularjs 性能最佳实践

angularjs performance best practices

我采用了基于 johnpapa style guide 的风格,并且 根据 Miško 在 49:44

上关于 Angularjs MTV meetup Best Practices 的演讲

他说性能取决于两件事:

  1. How many binding you have.
  2. How expensive you getter. (should fast)

而且我认为这意味着简单和快速。在我的理解中 getter 表示服务中的一种方法。但就我而言,有点复杂。 那么如何让它变得简单呢?我来宾不可能改变算法?或者只是调用服务中的内部(私有)函数?生效了吗?

所以这是我的问题:

  1. Best practice to make getter on a method in service so will not cause memory leak.

    I hope somebody can make an clear axample with the explanation

  2. How IIFE work ?

    Can somebody explain it to me?

  3. How IIFE work on a function inside factory (method in service)?

    Is it remove the global variable too? even if i use var, like when we return a factory?

您的问题(或多个问题)相当广泛。你在这里混淆和组合了多个概念,但我会尽力为你解开。

首先,IIFE。这与 Angular 性能无关。 IIFE 是一种为全局范围命名空间的方法。因此,最好的做法是使用 IIFE,而不是在全局范围内公开可能导致冲突的函数。

var globalObj =
    (function(){
      var privateVar = 5;
      function doPrivateFn(x, y){}

      return {
        publicFn: function(x){ doPrivateFn(x, privateVar) };
      }
    })();

现在,唯一暴露给全局范围的是 globalObj,它有 globalObj.publicFn().

其次,在使用Angular而不是内联匿名函数注册服务或控制器时,有时会使用IIFE:.factory("MySvc", function(){}):

(function(){
  angular.factory("MySvc", MySvcFactory);

  function MySvcFactory($http){
    // ...
  }
})();

这一切所做的只是在全局范围内隐藏 MySvc 工厂函数 MySvcFactory

最后,让getters变快的重点不是内存泄漏,而是getter函数的计算强度。

因此,如果您在表达式中有绑定,如下所示:

<span>{{getCount()}}</span>

或者这个:

<div ng-show="isShown(item)">{{item.prop}}</div>

我们的想法是让这些功能变得非常快,如果不仅仅是 getter:

$scope.isShown = function(item){
  return (item.a || item.b) && $scope.somethingElse;
}

永远不要做这样的事情:

<div ng-show="isUnique(item)">{{item}}</div>

其中 isUnique 执行 for 循环搜索:

$scope.isUnique = function(item){
   for (var i = 0; i < list.length; i++){
     if (item === list[i]) return false;
   }
   return true;
}

因为这个函数会在每个摘要周期 运行,有时甚至多次。相反,计算唯一性并将结果缓存在某个地方,这样你就可以 return 它。