立即调用的函数表达式(IIFE)与未
我看到很多代码,如:立即调用的函数表达式(IIFE)与未
var myApp ={};
(function() {
console.log("Hello");
this.var1 = "mark"; //"this" is global, because it runs immediately on load. Caller is global
myApp.sayGoodbye = function() {
console.log("Goodbye");
};
})();
导致匿名函数立即执行。但是,与仅将内联代码相比,这有什么优势?
var myApp ={};
console.log("Hello");
var1 = "mark";
myApp.sayGoodbye = function() {
console.log("Goodbye");
};
显然,这是一个与功能的范围内做的,但作为函数是匿名的,并呼吁通过窗口,它的范围(即this
)是全球性的,不是吗?
通常情况下,你会这样:
var myApp ={};
(function() {
console.log("Hello");
var var1 = "mark";
myApp.sayGoodbye = function() {
console.log("Goodbye");
};
})();
的主要区别是,var1
不扰乱全局命名空间。此次通话后,var1
仍然与以前相同(通常未定义)。
由于var1
只能从闭包中定义的函数来访问,所以它被称为“私有”。
除了避免可能的冲突原因之外,只是在不使用全局变量时不保留全局变量。
在这里,您没有局部变量,而是全局变量,其定义为this.var1
。这可能是一个错误,或者原因会在代码的其他地方找到。
谢谢,我认为这是最接近的解释。只要'var'声明了anon fn中的变量,它们就不会泄漏到全局名称空间中。我发现JavaScript中的'this'的定义非常混乱! – Mark
一个原因:将代码封装在匿名函数中允许您创建一个模块,该模块将公共API与私有函数以及仅在模块内部使用的变量区分开来。这可以避免污染全局名称空间。
var myApp ={};
(function() {
console.log("Hello");
this.var1 = "mark";
function helper() {/*Some code here*/;}
myApp.sayGoodbye = function() {
helper()
console.log("Goodbye");
};
})();
我可以说:
var myApp ={};
console.log("Hello");
var var1 = "mark";
function helper() {/*Some code here*/;}
myApp.sayGoodbye = function() {
helper()
console.log("Goodbye");
};
但随后在全球范围内包含了一个叫做helper
函数,它是没有用的,使用你的模块的人,并可能导致与其他模块可能的命名冲突。
我可以选择仅包含helper
作为myApp的一种方法。
var myApp ={};
console.log("Hello");
var var1 = "mark";
myApp.helper = function() {/*Some code here*/;}
myApp.sayGoodbye = function() {
this.helper()
console.log("Goodbye");
};
不过,我可能希望防止用户直接调用helper
,在这种情况下,这不会做。
在第二个片段中,var1附加到窗口范围,第一个不是。 – mpm
但是当我用Chrome浏览示例1时,'var1'是全局的。 – Mark
这个结构的原因不在我们看到的代码中。或者它完全没用。请向我们展示更多代码。 –