![](/img/trans.png)
[英]Immediately-Invoked Function Expression (IIFE) In JavaScript - Passing jQuery
[英]Immediately-Invoked Function Expression (IIFE) vs not
我看到很多类似的代码:
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");
};
显然,这与函数的范围有关,但是由于函数是匿名的并由window调用,因此它的范围(即this
)是全局的,不是吗?
通常,您将有:
var myApp ={};
(function() {
console.log("Hello");
var var1 = "mark";
myApp.sayGoodbye = function() {
console.log("Goodbye");
};
})();
主要区别在于var1
不会使全局名称空间混乱。 调用之后, var1
仍与以前相同(通常未定义)。
由于只能从闭包中定义的函数访问var1
,因此称其为“私有”。
除了避免可能引起冲突的原因外,在不使用时不要保留全局变量也更清洁。
在这里,您没有局部变量,而是定义为this.var1
的全局变量。 这可能是错误,或者原因可能在代码的其他地方找到。
一个原因:将代码包装在匿名函数中,使您可以创建一个模块,该模块将公共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
,在这种情况下将无法这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.