请解释这个“立即调用函数表达式”和“自调用匿名函数”之间的区别

时间:2013-11-22 04:05:52

标签: javascript

受此Stackoverflow问题的启发,JoãoSilva的回答:setTimeout with arguments

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

// 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片段都是非常跨浏览器兼容的。但这两者之间究竟有什么不同?

1 个答案:

答案 0 :(得分:1)

两种代码变体之间没有任何区别。

此外,实际上括号在那里是多余的。即使你用以下方式编写这段代码,它也能工作:

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

因为FunctionExpression概念而有效。只需要括号来区分FunctionExpressionFunctionDeclaration。实际上,括号可以替换为任何运算符,例如~

注意:甚至认为这段代码可以不加括号编写,我强烈反对这样做,因为括号现在类似于模式或关键词“Look!我是无用的括号,可能放在这里是因为立即调用这个功能“。因此,代码变得更加清晰。

网上有FunctionExpression vs FunctionDeclaration的大量讨论,所以我不再重复了。看看过去的SO问题:What is the difference between a function expression vs declaration in Javascript?