Javascript JS中的更多IIFE说明,让您更了解Java

Javascript JS中的更多IIFE说明,让您更了解Java,javascript,function,iife,Javascript,Function,Iife,我仍然对那些直接调用的函数表达式有点困惑。我得到了范围闭包(我读过Crockford的书),但是@plalx好心地给我写了一个例子,说明我在使用IIFE时的另一个疑问(最后链接到JSFIDLE)。这又让我有点困惑,我是怎么想的 在Java中,人们会认为: type doSome(type input){ do_stuff return same type }; 后来 doSome(data); 所以在js中我也可以这么做,对吗 function doSome(input){ do_stuff

我仍然对那些直接调用的函数表达式有点困惑。我得到了范围闭包(我读过Crockford的书),但是@plalx好心地给我写了一个例子,说明我在使用IIFE时的另一个疑问(最后链接到JSFIDLE)。这又让我有点困惑,我是怎么想的

在Java中,人们会认为:

type doSome(type input){
do_stuff
return same type
};
后来

doSome(data);
所以在js中我也可以这么做,对吗

function doSome(input){
do_stuff;
return someThing;
}
后者:

doSome(data);
doSome(data);
或是更常用的生活方式:

var doSome = (function(data){
do_stuff;
return something
})();
后者:

doSome(data);
doSome(data);
到目前为止我说的对吗

所以我的问题是:在这种情况下,为什么要用生命而不是其他方式? 引起这种怀疑的两个代码都在JSFIDLE中:


IIFE对于使用闭包保存对“私有”变量的引用非常有用。它们可用于防止其他人修改您想要保护的值,或保存只需执行一次(或偶尔)但函数经常使用的计算结果

document.body.innerHTML = deaccentuate(s);
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));

IIFE对于使用闭包保存对“私有”变量的引用非常有用。它们可用于防止其他人修改您想要保护的值,或保存只需执行一次(或偶尔)但函数经常使用的计算结果

document.body.innerHTML = deaccentuate(s);
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));

这两个示例之间的主要区别在于函数体的求值频率

在本例中:,对于IIFE,内部代码只计算一次,然后返回函数。当您通过运行函数时

document.body.innerHTML = deaccentuate(s);
它只执行返回的函数体,而不执行之前的语句

在另一个例子中:

每次运行
deaccentuate(s)
函数时,都会对整个函数体进行评估

document.body.innerHTML = deaccentuate(s);
因此,如果您有一些繁重的操作,您只想在运行时执行一次,或者像@RobG对私有成员所说的那样,在本例中使用IIFE

您可以通过在两个示例的顶部添加
console.log(“whatever”)
来验证这一点

->与/7一起使用/


->使用/8/

这两个示例之间的主要区别在于函数体的求值频率

在本例中:,对于IIFE,内部代码只计算一次,然后返回函数。当您通过运行函数时

document.body.innerHTML = deaccentuate(s);
它只执行返回的函数体,而不执行之前的语句

在另一个例子中:

每次运行
deaccentuate(s)
函数时,都会对整个函数体进行评估

document.body.innerHTML = deaccentuate(s);
因此,如果您有一些繁重的操作,您只想在运行时执行一次,或者像@RobG对私有成员所说的那样,在本例中使用IIFE

您可以通过在两个示例的顶部添加
console.log(“whatever”)
来验证这一点

->与/7一起使用/


->使用/8/

iLife将立即启动,因此它与上面的函数不同。IIFE是一个要立即执行的函数,因此它与调用
function init(){/**/}相同;init()使用
(函数(/**/){})(
如果你在生活中返回的东西是一个函数,那么你可以
doSome(数据)
否则它类似于将doSome设置为一个值。@asafreedman这是有意义的,plalx这样做了,返回了一个函数!现在我明白了:)非常感谢。iLife将立即启动,因此它与上面的函数不同。IIFE是一个要立即执行的函数,因此它与调用
function init(){/**/}相同;init()使用
(函数(/**/){})(
如果你在生活中返回的东西是一个函数,那么你可以
doSome(数据)
否则它类似于将doSome设置为一个值。@asafreedman这是有意义的,plalx这样做了,返回了一个函数!现在我明白了:)非常感谢。谢谢,如果我理解正确,你会通过调用
getText(element)
调用IIFE版本,对吗?谢谢,如果我理解正确,你会通过调用
getText(element)
调用IIFE版本,对吗?这也是正确的,我希望能够接受这两个答案,但我不能,多谢!这也是正确的,我希望能够接受这两个答案,但我不能,所以加倍感谢!