Javascript AngularJS函数声明、定位和嵌套

Javascript AngularJS函数声明、定位和嵌套,javascript,angularjs,Javascript,Angularjs,我是AngularJS的新手,我了解到您可以用两种不同的方式(也许更多…)声明函数: 第一: var myApp = angular.module('myApp', []); myApp.controller('mainCtrl', function($scope){ $scope.message = 'Yes'; }) myApp.controller('anotherCtrl', function($scope){ $scope.message = 'No'; }) 第

我是AngularJS的新手,我了解到您可以用两种不同的方式(也许更多…)声明函数:

第一:

var myApp = angular.module('myApp', []);

myApp.controller('mainCtrl', function($scope){
    $scope.message = 'Yes';
})

myApp.controller('anotherCtrl', function($scope){
    $scope.message = 'No';
})
第二:

var myApp = angular.module('myApp', []);

myApp
   .controller('mainCtrl', mainCtrl)
   .controller('anotherCtrl', anotherCtrl)

function mainCtrl($scope){
    $scope.message = 'Yes';
}

function anotherCtrl($scope){
    $scope.message = 'No';
}
使用第一种方法,我能够使用不同的文件(即:
controllers.js
和所有控制器,
directives.js
和所有指令等等)

我尝试使用第二种方法,如果函数在不同的文件中声明,则给出错误,这是有意义的,因为它们在一个文件中调用,但在另一个文件中调用。另一方面,它对我来说更具可读性,因为嵌套更少等等

有什么区别

有什么区别

你的第一个例子 在第一个示例中,您通过函数表达式创建函数,作为调用
myApp.controller
的一部分

在您的示例中,函数也是匿名的(它们没有名称),但您可以根据需要命名它们(除非您需要支持等同于IE8或更早版本的IE8或IE遗留模式):

(在我贫血的小博客上,我解释了为什么IE8和更早版本会出现这样的问题。)

由于函数除了与
.controller
连接的对象外,没有任何引用它们的对象,因此不能在其他地方使用它们,除非可以从
myApp
获取对它们的引用,或者如果您声明了一个变量并在进行调用的表达式中分配了它:

var mainCtrl;

// ...

myApp.controller('mainCtrl', mainCtrl = function mainCtrl($scope){
    $scope.message = 'Yes';
});

// ...you could use the `mainCtrl` variable here if you needed
// to reuse the function
你的第二个例子 在第二个示例中,您通过函数声明创建函数,然后在调用
myApp.controller
时引用这些函数。函数有名称(它们不是匿名的)。如果有必要的话,您可以在多个地方使用这些函数,而无需执行上面所示的变量操作


在第二个示例中,您可以在单独的文件中声明函数,但为了在调用
myApp.controller
时使用它们,您需要以某种方式获取对它们的引用。有很多方法可以做到这一点,从RequireJS到SystemJS到ES2015模块,再到Angular模块(我认为),或者任何其他AMD机制。

品味和风格问题;推荐普遍接受的、合理的良好做法。第二种做法也适用于不同的文件,只需确保按正确的顺序包含它们。所以基本上你应该在脚本之前引用包含函数的文件。哦,哇,所以建议使用第二种方法。。。!?这里有一个更全面的风格指南,也是很好的:@T.J.Crowder我看到你的删除建议,但我的问题是关于区别是什么,而不是“你会选择什么?”的问题。所以我听从了你的建议,也许在这一点上我会将代码切换到第二个示例,问题是,建议在声明新控制器(或任何其他?)时使用闭包,如:
(函数myController(){//code})()?@Gianmarco:所有JavaScript函数都是闭包。这里有一个内联调用函数表达式(IIFE)。如果你的意思是,你把所有定义控制器的代码都放在一个里面,我不知道这在角度世界中是否是必要的(我不“做”角度)。我在无角度的世界中这样做,以避免创建全局(在这种情况下,IIFE也称为“作用域函数”)。但是对于现代的JS和模块(AMD的东西,或者ES2015的东西,或者——我认为——ng模块),您模块中的顶级声明不再是全局声明,所以我认为您不需要它。
var mainCtrl;

// ...

myApp.controller('mainCtrl', mainCtrl = function mainCtrl($scope){
    $scope.message = 'Yes';
});

// ...you could use the `mainCtrl` variable here if you needed
// to reuse the function