请解释一下“;立即调用函数表达式“;以及“;自调用匿名函数”;

Please explain the differences between this "Immediately-Invoked Function Expression" and "Self Invoked Anonymous Function"

本文关键字:函数 调用 表达式 以及 解释 一下      更新时间:2023-09-26

João Silva的答案受到这个Stackloverflow问题的启发:带参数的setTimeout

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

// 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的概念。括号仅用于区分FunctionExpressionFunctionDeclaration。事实上,括号可以替换为任何运算符,例如~

注意:即使我认为这段代码可以在没有括号的情况下编写,我也强烈反对这样做,因为括号现在有点像一个模式或关键字,上面写着"看!我是无用的括号,可能是出于某种原因放在这里的,比如立即调用这个函数"。因此,代码通过这种方式变得更加清晰。

网上有很多关于FunctionExpressionFunctionDeclaration的讨论,所以我不再重复了。看看过去的SO问题:函数表达式和Javascript中的声明有什么区别?