繁体   English   中英

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

[英]Immediately-Invoked Function Expression (IIFE) vs not

我看到很多类似的代码:

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");
};

显然,这与函数的范围有关,但是由于函数是匿名的并由window调用,因此它的范围(即this )是全局的,不是吗?

通常,您将有:

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

主要区别在于var1不会使全局名称空间混乱。 调用之后, var1仍与以前相同(通常未定义)。

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

除了避免可能引起冲突的原因外,在不使用时不要保留全局变量也更清洁。

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

一个原因:将代码包装在匿名函数中,使您可以创建一个模块,该模块将公共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 ,在这种情况下将无法这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM