立即调用函数表达式 (IIFE) 与非立即调用函数表达式

Mar*_*ark 2 javascript design-patterns anonymous-function iife

我看到很多这样的代码:

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");
    };
})();
Run Code Online (Sandbox Code Playgroud)

这会导致匿名函数立即执行。但与仅仅将代码内联相比,这样做有什么好处呢?

var myApp ={};
console.log("Hello");
var1 = "mark";     
myApp.sayGoodbye = function() {
    console.log("Goodbye");
};
Run Code Online (Sandbox Code Playgroud)

显然这与函数的作用域有关,但由于该函数是匿名的并且由窗口调用,因此它的作用域(即this)是全局的,不是吗?

Den*_*ret 5

通常,你会有这样的:

        var myApp ={};
        (function() {
            console.log("Hello");
            var var1 = "mark";  
            myApp.sayGoodbye = function() {
                console.log("Goodbye");
            };
        })();
Run Code Online (Sandbox Code Playgroud)

主要区别在于var1不会扰乱全局命名空间。这次调用之后,var1仍然和之前一样(一般是未定义的)。

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

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

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