Javascript self calling anonymous function for scope closure
Possible Duplicate:
What advantages does using (function(window, document, undefined) { … })(window, document) confer?
我越来越多地在我一直在使用的库中看到这样的代码:
1 2 3 4 5 6 | (function (window) { var Foo = function () { } window.Foo = Foo; })(window); |
我看到这样做的论点是避免在创建(伪)类时在全局范围内工作。 但是,如果我错了,请纠正我,我始终明白窗口是全球范围的。 我相信,当你创建一个全局变量时,你实际上只是向窗口添加一个属性......除非这对ES5严格改变了吗?
所以,基本上,重点是什么? 我可以看到像这样组织的代码的唯一好处是,如果您希望稍后通过传入窗口以外的参数来轻松更改类的命名空间。
事实上,如果您忘记使用
使用这种模式可以更好地保护自己免受外部JavaScript世界的侵害。例如,某些其他脚本会覆盖window.undefined或任何其他变量,您可以获取该闭包内的值以从内部保存访问它。
例如
1 2 3 | (function _myApp( win, doc, undef ) { // app code }( this, this.document )); |
此外,当使用var声明变量或创建函数声明时,它们总是存储在当前激活对象和Lexical Environment Record中。这意味着,在不使用Function上下文的情况下,您可以轻松地从其他方面覆盖方法和变量,因为所有这些都将存储在当前上下文中(这将是全局上下文)
所以:
1 2 3 4 5 6 7 8 9 10 11 12 13 | (function _myApp( win, doc, undef ) { var myVar = 42; function myFunc() { } }( this, this.document )); (function _myModule( win, doc, undef ) { var myVar = 42; function myFunc() { } }( this, this.document )); |
这是因为闭包和Context,但如果你使用相同的代码,没有函数上下文,我们显然会覆盖我们的
你是对的,但区别在于函数内部的代码就像一个自动
1 2 3 4 5 6 7 8 | (function (window) { var Foo = function () { } var Bar = 69; // not in global scope window.Foo = Foo; // in global scope })(window); |
相反
1 2 3 4 | var Foo = function () { // in global scope } var Bar = 69; // in global scope |
和
1 2 3 4 5 6 7 | var Foo = function () { // in global scope } function init () { var Bar = 69; // not in global scope } init(); |
像全局变量一样邪恶,你需要至少有一个或没有办法访问你的脚本。您提供的代码是创建一个全局变量的一种方法。我更喜欢这种方式:
1 2 3 4 5 6 7 8 9 | window.Foo = (function () { var func = function () { // ... }; return { func: func }; })(); |