使用命名函数或将它们放在范围内

时间:2015-10-07 20:37:15

标签: javascript angularjs

我有一个Angular指令的大代码库,我一直在声明这样的函数:

$scope.doFoo = function() { ... };

因为我认为Angular可以在需要时管理/释放函数(不太确定我在哪里阅读)。

无论如何,我项目的贡献者告诉我他认为这不是真的。将函数声明为范围变量或仅将它们声明为普通函数是否有任何区别:

function doFoo() { ... };

我应该使用哪一个?

4 个答案:

答案 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

好参考:John Papa Angular style guide