我一直在JavaScript
和AngularJS
中使用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种方法的确切推理或区别,需要一些帮助才能理解何时使用不同的方法?
答案 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
};
})();