2

我看到很多代码,例如:

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)是全局的,不是吗?

4

2 回答 2

4

通常,你会有这个:

        var myApp ={};
        (function() {
            console.log("Hello");
            var var1 = "mark";  
            myApp.sayGoodbye = function() {
                console.log("Goodbye");
            };
        })();

主要区别在于var1它不会弄乱全局命名空间。在此调用之后,var1仍然与之前相同(通常未定义)。

由于var1只能从闭包中定义的函数访问,因此称为“私有”。

除了避免可能的冲突原因外,在无用时不要保留全局变量会更干净。

在这里,您没有局部变量,而是定义为全局变量this.var1。这可能是一个错误,或者原因会在代码的其他地方找到。

于 2013-01-14T11:58:56.023 回答
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对使用您的模块的任何人都没有用,并且可能导致与其他模块的命名冲突。

我也可以只包含helpermyApp 的一种方法。

var myApp ={};
console.log("Hello");
var var1 = "mark";

myApp.helper = function() {/*Some code here*/;}

myApp.sayGoodbye = function() {
    this.helper()
    console.log("Goodbye");
};

但是,我可能希望阻止用户直接调用helper,在这种情况下这是行不通的。

于 2013-01-14T12:29:27.203 回答