我看到很多代码如:
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
)是全局的,不是吗?
答案 0 :(得分:3)
通常,你会这样:
var myApp ={};
(function() {
console.log("Hello");
var var1 = "mark";
myApp.sayGoodbye = function() {
console.log("Goodbye");
};
})();
主要区别在于var1
不会使全局命名空间混乱。在此调用之后,var1
仍然与之前相同(通常是未定义的)。
因为var1
只能从闭包中定义的函数访问,所以它被称为“私有”。
除了避免可能的冲突原因之外,在没用时保持全局变量更加清晰。
在这里,您没有局部变量,而是一个定义为this.var1
的全局变量。这可能是一个错误,或者原因可以在代码的其他地方找到。
答案 1 :(得分:3)
一个原因:将代码包装在匿名函数中允许您创建一个模块,该模块将公共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
,在这种情况下,这不会做。