[英]More IIFE clarification in JS for a more Java mind
我仍然对那些立即调用函数表达式感到困惑。 我得到了作用域关闭(我已经阅读了Crockford的书),但是随后@plalx友好地给我写了这个示例,因为我有另一个疑问(使用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中:
IIFE对于使用闭包保存对“私有”变量的引用很有用。 它们可能被用来防止其他人修改您想要保护的值,或者保留只需要执行一次(或偶尔执行一次)但函数经常使用的计算结果。
例如,要获取元素的文本,您可以编写:
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));
这两个示例之间的主要区别在于函数主体的评估频率。
在此示例中: 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 /
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.