为什么要将IIFE分配给变量?

时间:2014-10-19 14:49:02

标签: javascript angularjs

我一直在JavaScriptAngularJS中使用IIFE,并且一直在使用以下结构:

方法1:

//IIFE Immediately Invoked Function Expression
(function () {


}());

但是,我经常看到以下情况,其中变量被分配给IIFE

方法2:

//IIFE Immediately Invoked Function Expression assigned to doStuff variable
var doStuff = (function () {


}());

注意:此问题关于此模式是什么或IIFE是什么。这与具体说明为什么人们会在IIFE上使用返回变量 以及它与Angular实践的关系。

在Angular方法1中工作正常,但在我看到的许多原始JS示例中,使用了方法2。我的假设是,doStuff中的任何东西都可以通过它获得并且可以调用。但是,我不是百分之百确定2种方法的确切推理或区别,需要一些帮助才能理解何时使用不同的方法?

1 个答案:

答案 0 :(得分:11)

方法#2的原因是你会在IIFE中找到返回某些东西的代码(通常但不一定是对象或函数)。 IIFE返回的是最终被分配的内容。 E.g:

//IIFE Immediately Invoked Function Expression assigned to doStuff variable
var doStuff = (function () {
    var privateInformationForDoStuff = 0;

    function doStuff() {
        console.log(++privateInformationForDoStuff);
    }

    return doStuff;
}());

在那里,变量最终成为对函数的引用,每次调用它时,都会给我们一个比前一次更高的数字。 IIFE用于确保没有任何内容可以修改privateInformationForDoStuff变量,它完全属于doStuff函数。

这种方法的常见用途是创建具有各种功能的对象,有时称为模块,这些对象也可能具有仅在“模块”内共享的私人信息:

var MyApp = (function() {
    var privateModuleInformation;
    var morePrivateModuleInformation;
    // ...

    function doThis() {
        // ...
    }

    function doThat() {
        // ...
    }

    function doTheOther() {
        // ...
    }

    return {
        doThis: doThis,
        doThat: doThat,
        doTheOther: doTheOther
    };
})();