2014-10-19 103 views
5

我已经使用在JavaScriptAngularJS IIFE和已使用的结构如下:为什么将一个IIFE分配给一个变量?

方法1:

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


}()); 

然而,我已经看到了经常以下其中一个变量是分配给IIFE

方法2:

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


}()); 

NOTE:这个问题是不是关于这种模式是什么或什么是一个IIFE是。这与为什么要在IIFE上使用返回变量及其与Angular实践的关系有关。

在角度方法1工作正常,但在我看到的许多原始JS例子中,使用了方法2。我的假设是,任何在doStuff中设置的东西都可以通过它调用并调用。但是,我不能100%确定这两种方法之间的确切推理或区别,并且需要一些帮助来理解何时使用不同的方法?

+0

@Bergi - 这ISN”重复 - 请仔细阅读问题,并查看与该链接的区别。该链接不回答这个问题。 – atconway 2014-10-19 15:53:23

+1

我不确定我是否理解这个问题。你似乎知道IIFE是做什么的;现在为什么要使用IIFE的退货?无论何时你想从表达式中返回一个返回值给doStuff赋值,而不是只执行一个void IIFE。如果你正在寻找用例,你应该谷歌为“模块模式”,因为这是一个带有返回值的IIFE被调用。 – Bergi 2014-10-19 15:59:13

+0

@Bergi - 我相信你刚刚发表的评论实际上是对我发布的内容以及我所称的'答案'的一个很好的解释。如果你重新打开并发布该Blurb作为答案,我会upvote。不要忘记,仅仅因为某些东西对你来说显而易见并不意味着它是OP(我)。另外,因为它显然不是结案的理由。我需要具体的例子和解释为什么返回变量与不使用。在Angular中,他们一直没有返回变量,但很多JS例子都使用返回值。我想知道并理解'为什么'。 – atconway 2014-10-19 16:06:22

回答

7

方法#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; 
}()); 

在那里,可变最终成为一个功能,每次它叫的时候,给了我们一个数比前次更高的参考。 IIFE在那里确保没有任何东西可以修改privateInformationForDoStuff变量,它对doStuff函数完全是私有的。

这样做的常见用途是创建与他们不同的功能,有时也被称为模块,这也可能是唯一的“模块”内共享私人信息的对象:

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

    function doThis() { 
     // ... 
    } 

    function doThat() { 
     // ... 
    } 

    function doTheOther() { 
     // ... 
    } 

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

这有助于很多谢谢你。我认为这种差距是为什么'AngularJS'不需要为为控制器,服务等创建的'IIFE'分配一个变量。我相信它不需要它们的原因是因为在'IIFE'中代码注册自己通过'ng-app'指令使用Angular模块容器,从而在不使用返回变量的情况下访问从'IIFE'返回的所有内容。你知道这是一个真正的解释吗? – atconway 2014-10-19 15:06:22

+0

@atconway:可能。您看到IIFE不会在非Angular代码中返回值。举例来说,这里是我通常用于浏览器的polyfill,它本来就没有'String#trim'(尚):http://pastie.org/9660901(当然它通常是更大的一部分)。 – 2014-10-19 15:08:42

+0

通过你在这篇文章中的例子,我假设变量'doStuff'和'myApp'将用于_same_ .js文件引用,而不是其他文件?或者,这些返回变量是否可以在多个.js文件中公开使用? – atconway 2014-10-19 15:16:40

相关问题