JS中更多IIFE澄清更多Java思想

时间:2013-10-16 23:56:12

标签: javascript function iife

我仍然对那些立即调用的函数表达式感到困惑。我得到了范围封闭(我读过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:

http://jsfiddle.net/Victornpb/PT6Xc/7/

http://jsfiddle.net/PT6Xc/8/

2 个答案:

答案 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 /

一起使用