繁体   English   中英

JS中对IIFE的更多说明使Java更加有心

[英]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中:

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

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM