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 = {}
做? 为什么是它的第一个函数内再次叫什么名字?
它说,这就是俗称的一个自动执行的匿名函数,但我真的不知道这意味着什么。
立即调用函数通常用来创建一个本地函数作用域是私有的,不能从外界访问,并且可以在不影响外界定义它自身的局部符号。 这往往是一个很好的做法,但在这种特殊情况下,我没有看到它创建超过几行代码以外的任何好处,因为它不用于任何东西。
这一段代码:
(function(exports){
exports.notGlobalFunction = function() {
console.log('I am not global');
};
}(module));
将是相同的一段代码没有这样的直接调用:
module.notGlobalFunction = function() {
console.log('I am not global');
};
有一两件事,不同的是,在第一,一个别名modules
称为exports
创建这是本地立即调用功能块。 但是,再没有什么独特之处在于与别名完成,代码也可以同样使用了modules
直接。
可变modules
被创建为单个全局父对象,然后可以容纳很多其它全局变量作为属性。 这通常被称为一个“命名空间”。 这通常是一个很好的设计模式,因为它最大限度地减少可能与在同一个项目/页面中使用的代码,其他部分发生冲突顶级的全局变量的数目。
所以,与其让这样的多个顶级变量:
var x, y, z;
人们可以作出这样一个顶级变量:
var modules = {};
而且,当时所有其他全局重视它的属性:
modules.x = 5;
modules.y = 10;
modules.z = 0;
这样一来,虽然仍存在多个全局变量,只有一个顶级的全球可能与其他代码段发生冲突。
类似地,立即调用函数创建其中变量可以创建是本地的该范围,不能与其他代码段干扰本地,私人范围:
(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);
这将创建一个新的空对象:
var module = {};
它不一样的:
var module = new Object();
此包装:
(function(exports){
...
}(module));
只有完成添加一个别名变量module
的功能的内部。 由于有匿名函数内没有局部变量或函数,你可以做相同:
module.notGlobalFunction = function() {
console.log('I am not global');
};
这样的一个匿名函数例如可以被用来创建一个私有变量:
(function(exports){
var s = 'I am not global';
exports.notGlobalFunction = function() {
console.log(s);
};
}(module));
现在该方法notGlobalFunction
添加到module
对象可以访问变量s
,但没有其他码可以达到它。
所述IIFE也加入到所述的方法module
正在传递作为参数的对象。 该代码是证明函数创建范围。 具有相同名称的方法被添加到所述浏览器的对象和所述头部对象(窗口)。
“自执行”可能会产生误导。 这是一个匿名函数表达式,没有分配或或作为参数给出的东西,但那个叫。 读到这里就立即调用的函数表达式(IIFE) 。
什么是VAR模块= {}做?
它初始化要充当一个命名空间的空对象。
为什么它的拳头函数内部再次调用?
它不是“叫”,而不是“内部”的第一功能。 对象被赋予作为参数(“出口”)到IEFE,和内部有分配给它的属性。