我有一个Angular指令的大代码库,我一直在声明这样的函数:
$scope.doFoo = function() { ... };
因为我认为Angular可以在需要时管理/释放函数(不太确定我在哪里阅读)。
无论如何,我项目的贡献者告诉我他认为这不是真的。将函数声明为范围变量或仅将它们声明为普通函数是否有任何区别:
function doFoo() { ... };
我应该使用哪一个?
答案 0 :(得分:3)
使用前一种方法,使用视图可能不需要的函数(例如控制器内的实用程序/辅助函数)很容易使作用域混乱。我认为将顶部视图使用的函数/变量列表分配给范围是合乎逻辑的。即:
$scope.doFoo = doFoo;
然后,在文件底部,您可以组织您的功能。即:
function doFoo() { ... ]
如果不执行$scope.doFoo
,您将无法在模板中使用doFoo(例如<div ng-click="doFoo()">
)。
这样,如果doFoo()
需要使用一些帮助函数,你可以在控制器中的某处声明它,而不是通过添加它来混淆范围。
我更喜欢使用controllerAs语法,并将vm
绑定到this
,但这是一个不同的故事。 (可以阅读关于该样式偏好here。)
答案 1 :(得分:2)
Zack Tanner的回答是正确的(而且简洁!),但这里有一些补充信息也可以帮助你。
首先,我们可以就此达成一致:
功能声明
function doFoo() {
//...
}
这声明了当前函数范围(闭包)中的函数
功能表达
$scope.doFoo = function() {
//...
}
这声明一个函数属于一个对象
那么差异是什么,为什么要关心?这是Zack Tanner的解释:
angular.module("myModule").controller(["$scope", function($scope) {
var self = this;
$scope.doFoo = doFoo;
$scope.doBar = doBar;
////Implementation////
function doFoo() {
// do foo stuff
}
function doBar() {
// do bar stuff
}
}]);
首先,这可能是从C / C ++或John Papa编程的智慧中被公然(并且合理地)窃取的。在任何一种情况下,其工作原因(如果在控制器中的注释之前放置return
,甚至可以工作)是因为功能提升。基本上,它归结为一个简单的规则:函数声明将永远是&#34;悬挂&#34;在中声明范围的顶部。对var
iables来说也是如此!
要直接回答您的问题,我不了解Angular发布或管理功能的能力(我怀疑它的确如何?),但在这种情况下确实需要申报您的功能并分配它们到你的$scope
。此外,&#34;控制器为&#34;语法确实很棒,所以如果可能的话考虑使用它(没有$scope
,加上原型链没有奇怪!)。
tl; dr使用function doFoo() { //... }
答案 2 :(得分:1)
绑定到$scope
或控制器(通过控制器AS)的任何函数(方法?)将在它们所附加的视图上可用。以更传统的方式function doFoo() { ... }
命名的函数只能在各自的( lexical )范围内访问(无论是控制器,服务,指令等)。基本上,$scope
允许你在词法范围之外使用你的函数(为了澄清,$ scope是一个在控制器/指令的词法范围之外可用的对象,就像在服务中声明函数一样,你可以&除非将它们附加到返回的对象,否则不要在其他地方使用它们。)
每个人都在应用程序中占有一席之地,这完全取决于您希望如何使用该功能。
答案 3 :(得分:1)
是的,这是一个合理的区别,您只需要将函数绑定到视图中使用的范围。没有必要使用从未在视图中使用过的东西来污染范围。
通用样式指南最佳实践也是在范围声明下声明函数,以便更容易查看范围内包含的内容
示例:
// show all the scope related stuff at top of component
$scope.foo = foo;// reference to function below
// all the business stuff at bottom of component
function foo(){}//used in view
function bar(){} // only used as utility in controller