JavaScript自我调用匿名函数以封闭范围



可能的重复:
使用(函数(窗口,文档,未定义){…})(窗口,文档)会议有哪些优点?

我越来越多地在我一直在使用的库中看到这样的代码:

(function (window) {
    var Foo = function () {
    }
    window.Foo = Foo;
})(window);

我看到的论点是避免在创建(伪)类时在全局范围中工作。但是,如果我错了,请纠正我,我总是理解该窗口是全球范围。我相信,当您创建一个全局变量时,您实际上只是在窗口中添加属性...除非ES5严格发生了变化?

那么,基本上,有什么意义?我可以看到这样组织的唯一好处是,如果您想通过通过窗口以外的参数来轻松地更改类的名称空间。

Infact,严格模式如果您忘记使用var进行任何变量声明,则会引发异常。但是,即使不使用外闭合

也可以正常工作。

使用这种模式更多地是为了保护自己免受JavaScript World之外的侵害。例如,其他一些脚本覆盖 window.undefined 或任何其他变量,您可以在该闭合中获取值,以从内部保存访问它。

例如

(function _myApp( win, doc, undef ) {
    // app code
}( this, this.document ));

另外,当用 var 声明变量或创建函数声明时,这些变量始终存储在当前激活对象中>词汇环境记录。这意味着,不使用A 函数上下文,您可以轻松地覆盖其他点的方法和变量,因为所有这些都将存储在当前上下文中(这将是全球一个)

so:

(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 ));

这是因为闭合上下文,但是如果您使用相同的代码,而没有函数上下文,我们显然会覆盖我们的myVarmyFunc。这可能是在同一文件或其他加载脚本中从任何地方发生的。

与全局变量一样邪恶,您需要至少有一个或无法访问脚本。您提供的代码是创建一个全局变量的一种方法。我更喜欢这种方式:

window.Foo = (function () {
    var func = function () {
        //  ...
    };
    return {
        func: func
    };
})();

您的正确,但区别在于该函数内部的代码就像自动init函数。

(function (window) {
    var Foo = function () {
    }
    var Bar = 69; // not in global scope
    window.Foo = Foo; // in global scope
})(window);

而不是

var Foo = function () { // in global scope
}
var Bar = 69; // in global scope

var Foo = function () { // in global scope
}
function init () {
    var Bar = 69; // not in global scope
}
init();