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

atc*_*way 11 javascript angularjs

我一直在使用IIFE中JavaScriptAngularJS,并一直在使用的结构如下:

方法1:

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


}());
Run Code Online (Sandbox Code Playgroud)

但是,我已经看到以下经常将变量分配给 IIFE

方法2:

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


}());
Run Code Online (Sandbox Code Playgroud)

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

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

T.J*_*der 12

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

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

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

    return doStuff;
}());
Run Code Online (Sandbox Code Playgroud)

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

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

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

    function doThis() {
        // ...
    }

    function doThat() {
        // ...
    }

    function doTheOther() {
        // ...
    }

    return {
        doThis: doThis,
        doThat: doThat,
        doTheOther: doTheOther
    };
})();
Run Code Online (Sandbox Code Playgroud)

  • 非常有帮助,谢谢。我认为差距就是为什么AngularJS不需要将变量分配给为控制器,服务等创建的IIFE的原因。我相信它不需要它们的原因是因为代码在IIFE内部进行了注册可以通过ng-app指令使用Angular模块容器,从而无需使用return变量即可访问从IIFE返回的所有内容。您知道这是一个真实的解释吗? (2认同)
  • @atconway:如果上面的代码在全局范围内,则它们将是全局变量,因此可以由同一窗口中加载的其他JavaScript使用。如果上面的代码不在全局范围内,则它们不是全局变量,因此可能不会。我尽量避免在代码中创建任何全局变量。您可能会看到各种用于加载相互依赖的脚本的AMD(异步模块定义)机制。 (2认同)