我采用了基于johnpapa风格指南的风格,并且根据Miško在Angularjs MTV meetup最佳实践49:44 上的演示
他说表现取决于两件事:
- 你有多少捆
- 你的吸气剂有多贵。(应该很快)
我认为这意味着简单快捷。在我的理解中,getter是指服务中的一种方法。但在我的情况下有点复杂。那么,如何让它变得简单呢?我很抱歉不可能改变算法?或者只是调用服务中的内部(私有)函数?它生效了吗?
所以我的问题是:
- 在服务中的方法上生成getter的最佳实践,这样就不会导致内存泄漏。
我希望有人能解释清楚
- IIFE是如何运作的?
有人能给我解释一下吗
- 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;
}
因为这个函数将在每个摘要周期运行,有时甚至运行多次。相反,计算唯一性并将结果缓存在某个位置,这样您就可以直接返回它。