javascript - 是什么决定了一个 JavaScript 函数是一个命名的匿名函数还是一个,嗯,常规函数?

标签 javascript syntax semantics

阅读 "A re-introduction to JavaScript"我注意到函数有一些有趣的地方:

The name provided to an anonymous function as above is(or at least should be) only available to the function's own scope.

在 nodejs 提示符下根据教程中的代码输入一些东西我能够验证 node 与作者一致:

function add(foo, bar) {
  return foo + bar;
}

add(1, 2);

让我得到 3,并且:

var five = (function plus(foo, bar) {
             return foo + bar;
           })(2, 3);
plus(2, 3);

给我一​​个关于 plus 未被定义的语法错误。

我有点困惑,因为我用来定义这两个函数的代码是相同的(除了名称)。 JavaScript 如何知道第一个是常规函数而第二个是命名匿名函数?

最佳答案

首先是一个普通的函数声明。声明的名称被引入到当前范围内,并隐式引用函数体。在这种形式中,function 是一个语句,因此不返回任何值。

第二个是函数表达式,解释器知道它是因为它是赋值右侧的一部分,并且因为它周围有大括号。任何时候 function 出现在可以提供其他“值”(或“表达式”)的地方,那么您所拥有的就是一个函数表达式。该表达式的结果是对函数体的引用。

函数表达式的名称(如果给定的话)仅在函数中可用,如您的链接中所述。

恕我直言,该链接中的术语不正确。他们所谓的“命名匿名函数”在我看来应该被称为“命名函数表达式”。这种明显的错误可能源于这样一个事实,即所有匿名函数实际上都是函数表达式,但并非所有函数表达式都是匿名的。

请注意,如果您使用这种样式:

var foo = function bar() {
    ...
}

那么如上所述 bar 是一个函数表达式,然后将其结果赋值给变量 foo。名称 bar 未放入当前范围,但在函数本身内可用。

变量 foo 的声明将被提升到范围的顶部,但在实际执行上面的行之前不会为其分配值(即对函数表达式的引用)。

另一个有趣的差异演示是这样的(来自 Chrome 控制台):

> function() { }
SyntaxError: Unexpected token (
> a = function() { }
function () { }

请注意,唯一的区别是后者对a 进行了赋值。尝试使用语句 声明匿名函数是非法的,因为语言语法要求函数语句包含函数标签。然而,后者隐式地是一个函数表达式,允许是匿名的。

关于javascript - 是什么决定了一个 JavaScript 函数是一个命名的匿名函数还是一个,嗯,常规函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12081088/

相关文章:

javascript - 无法使用 Cloud Function for Firebase 通过电子邮件获取用户

dictionary - 如何在 Julia 中初始化字典?

syntax - 模块缩写

java - 使用 ClearNLP 语义角色标签器

javascript - Multer TypeError : fields. forEach 不是函数

javascript - 无法从js中的 map 获取值(value)

database - 没有 FROM 关键字的 Sparql

java - Java 类中的默认可见性可以有 protected 成员吗?

javascript - 为什么谷歌地图自动完成服务在结果中包含爱尔兰地址,即使仅限于 "gb"?

c++ - C++ 中的 priority_queues