问题描述
方法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
};
})();
解决方法
我一直在使用IIFE中JavaScript
和AngularJS
,并一直在使用的结构如下:
方法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
都可以通过它进行调用。但是,我不确定这两种方法之间的确切推理或区别是100%肯定的,需要一些帮助来了解何时使用不同的方法吗?