angularjs性能最佳实践



我采用了基于johnpapa风格指南的风格,并且根据Miško在Angularjs MTV meetup最佳实践49:44 上的演示

他说表现取决于两件事:

  1. 你有多少捆
  2. 你的吸气剂有多贵。(应该很快)

我认为这意味着简单快捷。在我的理解中,getter是指服务中的一种方法。但在我的情况下有点复杂。那么,如何让它变得简单呢?我很抱歉不可能改变算法?或者只是调用服务中的内部(私有)函数?它生效了吗?

所以我的问题是:

  1. 在服务中的方法上生成getter的最佳实践,这样就不会导致内存泄漏。

    我希望有人能解释清楚

  2. IIFE是如何运作的?

    有人能给我解释一下吗

  3. IIFE如何在工厂内部处理函数(服务中的方法)?

    它是否也删除了全局变量?即使我使用var,比如当我们返回工厂时

您的问题(或者更确切地说是多个问题)相当宽泛。你在这里混淆和组合了多个概念,但我会试图解开你。

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

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

现在,唯一暴露在全局作用域中的是globalObj,它有globalObj.publicFn()

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

(function(){
  angular.factory("MySvc", MySvcFactory);
  function MySvcFactory($http){
    // ...
  }
})();

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

最后,使getter快速的关键不是内存泄漏,而是getter函数的计算强度。

所以,如果你在一个表达式中有一个绑定,比如:

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

或者这个:

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

我们的想法是让这些功能非常快速,如果不仅仅是一个吸气剂的话:

$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;
}

因为这个函数将在每个摘要周期运行,有时甚至运行多次。相反,计算唯一性并将结果缓存在某个位置,这样您就可以直接返回它。

最新更新