【问题标题】:Please explain the differences between this "Immediately-Invoked Function Expression" and "Self Invoked Anonymous Function" [duplicate]请解释这个“立即调用函数表达式”和“自调用匿名函数”之间的区别[重复]
【发布时间】:2013-12-06 20:36:40
【问题描述】:

灵感来自这个 Stackoverflow 问题,João Silva 的回答:setTimeout with arguments

我想知道是否有人可以向我解释这段代码 sn-p 与后者有何不同:

// 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);

所以两者都有效,并且两个代码 sn-ps 之间只有一个括号差异,而且我再次不是 javascript 专家,但我直观地觉得这两个 javascript sn-ps 都非常跨浏览器兼容。但两者之间到底有什么不同呢?

【问题讨论】:

  • 您的示例没有多大意义,您的 IIFE 应该返回一个 func 引用以设置为 setTimeout 的回调?您所拥有的将立即被调用。
  • 但是两个 sn-p 都不会立即被调用,两者都是在分配的 2 秒超时后调用...
  • 哎呀,对不起,你是对的,我更新了我的答案,现在两个 js sn-ps 在分配的 2 秒超时后都会被调用
  • 仅供参考,“立即调用函数表达式”和“自调用匿名函数”是同义词。

标签: javascript


【解决方案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 概念,它可以工作。仅需要括号来区分 FunctionExpressions 和 FunctionDeclaration。事实上,括号可以替换为任何运算符,例如~

注意:即使认为这段代码可以不带括号,我也强烈反对这样做,因为括号现在就像一个模式或关键字说“看!我是无用的括号,可能是出于立即调用此功能之类的原因放置在这里”。这样代码就变得更清晰了。

网上FunctionExpression vs FunctionDeclaration的讨论很多,我不再赘述。看看过去的 SO 问题:What is the difference between a function expression vs declaration in Javascript?

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2011-01-09
    • 2011-12-28
    • 2017-10-20
    相关资源
    最近更新 更多