【问题标题】:How do I correctly write a self-executing function in JavaScript? [duplicate]如何在 JavaScript 中正确编写自执行函数? [复制]
【发布时间】:2013-08-05 07:34:08
【问题描述】:

我对 JavaScript 比较陌生,我目前正在研究它,我遇到了这种具有自执行功能的代码。

这是第一个:

(function(message){
    var myMessage = message;
    alert(myMessage);
})("hello");

这是第二个:

(function(message){
    var myMessage = message;
    alert(myMessage);
}("hello"));

它们都可以正常工作,但我只是想知道两者之间有什么区别以及何时应该使用其中一个。

先生/女士,您的回答会很有帮助。谢谢++

【问题讨论】:

  • 根据 crockford 的说法,第二个是首选。

标签: javascript


【解决方案1】:

两者都是有效的,尽管两者之间存在细微的语义差异,我在the IIFE's tag wiki 中解释如下:

除了两者之间存在细微的语义差异(第一个计算结果为(IIFE 的返回值),而第二个计算结果为(定义的函数)

换句话说,两者都是正确的,但是因为两者都将函数定义呈现为表达式,而不是语句,尽管第一个版本将函数的定义分组,然后调用该函数,而第二个版本定义了函数,调用它,然后将其返回值分组...

【讨论】:

  • "(" callExpression ")"callExpression 绝对没有语义差异,并且都评估为 callExpression
  • 不同之处在于分组运算符的计算结果:(function(){})(); == (functionExpression)()(function(){}()); == (returnValue)
  • (function(){})() -> "(" FunctionExpression ")" Arguments -> FunctionExpression Arguments -> CallExpression(function(){}()) -> "(" FunctionExpression Arguments ")" -> "(" CallExpression ")" -> CallExpression。因此,当您到达 AST 时,您将无法分辨原始内容是什么,因此可能无法生成定义函数并调用它与返回值或您声称的任何内容的代码
  • 我同意@Esailija,它看起来确实是distinction without a difference
  • @Esailija,我并不是说代码的工作方式有什么不同。这两个语句的计算结果完全相同,因为(func)() === return value === (return value)。只是说你在对某些东西进行分组,这就是为什么 DC 会认为 OP 的第一个 sn-ps 是不合逻辑和错误的
猜你喜欢
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 2017-11-13
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
相关资源
最近更新 更多