var module = {};
(function(exports){
exports.notGlobalFunction = function() {
console.log('I am not global');
};
}(module));
function notGlobalFunction() {
console.log('I am global');
}
notGlobalFunction(); //outputs "I am global"
module.notGlobalFunction(); //outputs "I am not global"
谁能帮我理解这是怎么回事?我知道如果您调用 notGlobalFunction()
,它只会调用第二个函数。
但是 var module = {}
在做什么?为什么在第一个函数中再次调用它?
它说这通常被称为自执行匿名函数,但我真的不知道那是什么意思。
最佳答案
立即调用的函数通常用于创建一个局部函数作用域,该作用域是私有(private)的,不能从外部世界访问,并且可以定义它自己的局部符号而不影响外部世界。这通常是一种很好的做法,但在这种特殊情况下,除了增加几行代码外,我看不出它有任何好处,因为它没有用于任何用途。
这段代码:
(function(exports){
exports.notGlobalFunction = function() {
console.log('I am not global');
};
}(module));
如果没有像这样的立即调用,将与一段代码相同:
module.notGlobalFunction = function() {
console.log('I am not global');
};
有一点不同的是,在第一个中,创建了一个名为 exports
的 modules
别名,它是立即调用的功能 block 的本地别名。但是,别名并没有做任何独特的事情,代码也可以直接使用 modules
。
变量 modules
被创建为单个全局父对象,然后可以将许多其他全局变量作为属性保存。这通常称为“ namespace ”。这通常是一个很好的设计模式,因为它最大限度地减少了可能与同一项目/页面中使用的其他代码片段发生冲突的顶级全局变量的数量。
所以不要像这样创建多个顶级变量:
var x, y, z;
可以像这样创建一个顶级变量:
var modules = {};
然后,将所有其他全局变量作为属性附加到它:
modules.x = 5;
modules.y = 10;
modules.z = 0;
这样,虽然仍然有多个全局变量,但只有一个可能与其他代码段冲突的顶级全局变量。
类似地,一个立即调用的函数会创建一个局部的私有(private)作用域,在该作用域中可以创建局部于该作用域并且不会干扰其他代码片段的变量:
(function() {
var x, y, z;
// variables x, y and z are available to any code inside this immediately invoked function
// and they act like global variables inside this function block and
// there values will persist for the lifetime of the program
// But, they are not truly global and will not interfere with any other global
// variables and cannot be accessed by code outside this block.
// They create both privacy and isolation, yet work just as well
})();
将参数传递给立即调用的函数只是一种将值传递给立即调用的函数作用域的方法,该作用域将具有自己的局部符号:
(function(exports) {
// creates a local symbol in this function block called exports
// that is assigned an initial value of module
})(module);
关于javascript - 什么是自执行匿名函数或这段代码在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14322708/