Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 的(函数())在哪里?_Javascript_Angularjs - Fatal编程技术网

Javascript 的(函数())在哪里?

Javascript 的(函数())在哪里?,javascript,angularjs,Javascript,Angularjs,我正在研究编写得非常好的angularjs应用程序 在控制器定义中,他使用了: (function () { var MyController = function ($rootScope, $scope, $location, $routeParams, $timeout, config, dataService, modalService) { //do something } MyController.$inject = ['$rootScope',

我正在研究编写得非常好的angularjs应用程序

在控制器定义中,他使用了:

(function () {
    var MyController = function ($rootScope, $scope, $location, $routeParams, $timeout, config, dataService, modalService) {
        //do something
    }
    MyController.$inject = ['$rootScope', '$scope', '$location', '$routeParams','$timeout', 'config', 'dataService', 'modalService'];
    angular.module('app').controller('MyController', MyController);
}());
而不是
(不带函数())

什么是
(function())实际完成


这样做有什么好处?

这是一个自动执行的函数。好处是用
var
声明的变量是函数作用域的局部变量,不会污染全局作用域

var foo = 'something';
(function() {
    var foo = 'something else';
}());

foo; // 'something'
this.foo; // 'something'
window.foo; // 'something'
(对于非浏览器环境,
窗口
可能是
全局
或其他参考,或者可能无法直接访问。)

保护全球范围有许多好处。这意味着您不会干扰可能位于全局范围内的其他模块或库,也意味着您不会覆盖可能导致意外副作用的全局属性

考虑这种情况:

var location = 'https://google.com/';
在全局范围内,在浏览器环境中,这将导致浏览器加载Google(并可能破坏当前页面的状态)。在函数范围内(包括自执行函数),它是完全安全的

(function() {
    var location = 'https://google.com/';
}());
变量被分配给内存并立即丢弃(指定用于垃圾收集)

同样值得注意的是:在全局范围内声明的变量,或者在没有声明的情况下赋值的变量,都是作为全局对象的属性创建的。在全局范围内执行,以下各项都是等效的(尽管有上述关于全局对象名称或可用性的注释):

它不是“没有函数”,而是函数存储在变量中

其优点是,您可以节省一些代码行,并大大提高可读性:

var refreshFull = function() {
    // 200 LoC
}
store.on('load',refreshFull);
store.on('remove',refreshFull);
store.on('filterchange',refreshFull);
...

请注意,代码总是在某个地方有一个
函数()。。。无论是内联编写还是使用变量。

自执行函数就像“使用它,然后忘记”。默认情况下,自执行函数中声明的变量只在自执行函数块中可用,因此您不必担心它们会污染全局范围。此外,它们不需要任何事件来执行

值得注意,因为示例中的API是有角度的,虽然可以在没有全局效果的情况下完成同样的事情,但灵活性要差得多(因为您无法轻松地将
MyController
函数作为参考传递):
app.controller('MyController'),['$rootScope'、'$scope'、…,function(…){…}]);
那么您在声明控制器时说它没有用吗?不,我是说使用数组语法会有明显的成本。
foo = 'bar';
var foo = 'bar';
this.foo = 'bar';
window.foo = 'bar';
var refreshFull = function() {
    // 200 LoC
}
store.on('load',refreshFull);
store.on('remove',refreshFull);
store.on('filterchange',refreshFull);
...