我仍然对那些立即调用的函数表达式感到困惑。我得到了范围封闭(我读过Crockford的书),但后来@plalx亲切地给我写了this例子,用另一个怀疑我用(最后用jsfiddle链接)使用IIFE。这让我有点困惑,这就是我的想法。
在Java中,人们会想:
type doSome(type input){
do_stuff
return same type
};
然后再
doSome(data);
所以在js我可以做同样的事,对吧?
function doSome(input){
do_stuff;
return someThing;
}
和后者:
doSome(data);
或更多地使用IIFE:
var doSome = (function(data){
do_stuff;
return something
})();
和后者:
doSome(data);
到目前为止我是否正确?
所以我的问题是:为什么在这种情况下使用IIFE而不是其他方式? 提出这个疑问的两个代码都在jsfiddle:
答案 0 :(得分:2)
IIFE对于使用闭包来保存对“私有”变量的引用很有用。它们可能用于防止其他人修改您想要保护的值,或者保存计算结果,只需要执行一次(或偶尔)但该功能经常使用。
e.g。获取你可能写的元素的文本:
function getText(el) {
if (typeof el.textContent == 'string') {
return el.textContent;
} else if (typeof el.innerText == 'string') {
return el.innerText;
}
}
但为了避免每次都进行测试,可以使用IIFE并且只进行一次测试:
var getText = (function() {
var d = document.createElement('div');
if (typeof div.textContent == 'string') {
return function (el) {
return el.textContent;
};
} else if (typeof div.innerText == 'string') {
return function (el) {
return el.innerText;
};
}
}());
所以测试只执行一次。您还可以使用类似的策略保留对全局对象的引用:
var someFn = (function (global) {
// in here, you are certain that global references the global object
return function() {
// and in here too
};
// And here's where it comes from
}(this));
答案 1 :(得分:2)
这两个例子的主要区别在于评估函数体的频率。
在此示例中:http://jsfiddle.net/Victornpb/PT6Xc/7/,使用IIFE,内部代码仅评估一次并返回函数。当您通过
运行该功能时document.body.innerHTML = deaccentuate(s);
它只执行返回的函数体,而不是它之前的语句。
在另一个示例中:http://jsfiddle.net/PT6Xc/8/
每次运行deaccentuate(s)
函数时,都会评估函数的整个主体。
document.body.innerHTML = deaccentuate(s);
因此,如果您只是想在运行时执行一次繁重的操作,或者像@RobG对私人成员说的那样,请在这种情况下使用IIFE。
您可以通过在两个示例的顶部添加console.log("whatever")
进行验证来验证这一点。
http://jsfiddle.net/PT6Xc/9/ - >与/ 7 /
一起使用和
http://jsfiddle.net/PT6Xc/10/ - >与/ 8 /
一起使用