为什么将一个IIFE分配给一个变量?
我已经使用在JavaScript
和AngularJS
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%确定这两种方法之间的确切推理或区别,并且需要一些帮助来理解何时使用不同的方法?
方法#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
};
})();
这有助于很多谢谢你。我认为这种差距是为什么'AngularJS'不需要为为控制器,服务等创建的'IIFE'分配一个变量。我相信它不需要它们的原因是因为在'IIFE'中代码注册自己通过'ng-app'指令使用Angular模块容器,从而在不使用返回变量的情况下访问从'IIFE'返回的所有内容。你知道这是一个真正的解释吗? – atconway 2014-10-19 15:06:22
@atconway:可能。您看到IIFE不会在非Angular代码中返回值。举例来说,这里是我通常用于浏览器的polyfill,它本来就没有'String#trim'(尚):http://pastie.org/9660901(当然它通常是更大的一部分)。 – 2014-10-19 15:08:42
通过你在这篇文章中的例子,我假设变量'doStuff'和'myApp'将用于_same_ .js文件引用,而不是其他文件?或者,这些返回变量是否可以在多个.js文件中公开使用? – atconway 2014-10-19 15:16:40
@Bergi - 这ISN”重复 - 请仔细阅读问题,并查看与该链接的区别。该链接不回答这个问题。 – atconway 2014-10-19 15:53:23
我不确定我是否理解这个问题。你似乎知道IIFE是做什么的;现在为什么要使用IIFE的退货?无论何时你想从表达式中返回一个返回值给doStuff赋值,而不是只执行一个void IIFE。如果你正在寻找用例,你应该谷歌为“模块模式”,因为这是一个带有返回值的IIFE被调用。 – Bergi 2014-10-19 15:59:13
@Bergi - 我相信你刚刚发表的评论实际上是对我发布的内容以及我所称的'答案'的一个很好的解释。如果你重新打开并发布该Blurb作为答案,我会upvote。不要忘记,仅仅因为某些东西对你来说显而易见并不意味着它是OP(我)。另外,因为它显然不是结案的理由。我需要具体的例子和解释为什么返回变量与不使用。在Angular中,他们一直没有返回变量,但很多JS例子都使用返回值。我想知道并理解'为什么'。 – atconway 2014-10-19 16:06:22