Javascript 请解释这两者之间的区别;立即调用的函数表达式;及;自调用匿名函数“;

Javascript 请解释这两者之间的区别;立即调用的函数表达式;及;自调用匿名函数“;,javascript,Javascript,受这个问题的启发,若昂·席尔瓦的回答是: 我想知道是否有人能向我解释一下这段代码与后者的区别: // Parameter to use var bar = 'bar'; // Go setTimeout( (function(arg1){ return function () { console.log(arg1); //ya arg1 has the value: 'bar'! } }(bar)), 2000); 我原以为括号会稍有不同,我知道这是一

受这个问题的启发,若昂·席尔瓦的回答是:

我想知道是否有人能向我解释一下这段代码与后者的区别:

// Parameter to use
var bar = 'bar';

// Go
setTimeout(
  (function(arg1){
    return function () {
        console.log(arg1); //ya arg1 has the value: 'bar'!
    }
  }(bar)), 2000);
我原以为括号会稍有不同,我知道这是一个立即调用的函数表达式(我相信是Ben Alman创造的)与闭包结合在一起,但我并不完全理解这段代码是如何执行的

我想象的是一个由闭包调用的自调用匿名函数,我了解它是如何工作的,至少有点了解

 // Parameter to use
    var bar = 'bar';

// Go
setTimeout(
  (function(arg1){
    return function () {
        console.log(arg1); //ya arg1 has the value: 'bar'!
    }
  })(bar), 2000);

所以这两个代码段都可以工作,而且这两个代码段之间只有一个括号的区别,而且我也不是javascript专家,但我直觉上觉得这两个javascript代码段都是非常跨浏览器兼容的。但是这两种代码之间到底有什么不同呢?

这两种代码变体之间根本没有区别

此外,实际上括号是多余的。即使您以以下方式编写这段代码,它也可以工作:

// Go
setTimeout(
  function(arg1){ // let's get rid of braces
    return function () {
        console.log(arg1); //ya arg1 has the value: 'bar'!
    }
  }(bar), 2000);
由于
FunctionExpression
概念,它可以工作。括号仅用于区分
FunctionExpression
s和
FunctionDeclaration
。事实上,括号可以替换为任何运算符,例如
~

注意:尽管本代码可以不用括号编写,但我强烈反对这样做,因为括号现在类似于一种模式或一个关键字,上面写着“看!我是无用的括号,放在这里可能是为了立即调用此函数”。这样代码就变得更清晰了


关于
FunctionExpression
vs
FunctionDeclaration
的讨论很多,所以我不再重复了。看看过去的SO问题:

您的示例没有多大意义,您的iLife应该返回一个func引用以设置为setTimeout的回调?您所拥有的将立即被调用。但两个代码段都不会立即被调用,都是在分配的2秒超时后被调用的…哎呀,对不起,您是对的,我更新了我的答案,现在两个js代码段都是在分配的2秒时间后被调用的,“立即调用的函数表达式”和“自调用匿名函数”是同义词。