Sam*_*ard 4 javascript syntax semantics
阅读"重新介绍JavaScript"我注意到一些有关函数的有趣内容:
如上所述提供给匿名函数的名称(或者至少应该是)仅对函数自己的范围可用.
根据nodejs提示中教程中的代码输入一些内容我能够验证该节点是否与作者一致:
function add(foo, bar) {
return foo + bar;
}
add(1, 2);
Run Code Online (Sandbox Code Playgroud)
得到我3,并:
var five = (function plus(foo, bar) {
return foo + bar;
})(2, 3);
plus(2, 3);
Run Code Online (Sandbox Code Playgroud)
给我一个关于加上未定义的语法错误.
我有点困惑,因为我用来定义两个函数的代码是相同的(名称除外).JavaScript如何知道第一个是常规函数,第二个是命名匿名函数?
第一个是正常的函数声明.声明的名称被引入当前作用域,并隐式引用函数体.在这种形式中,function
是一个声明,因此不返回任何值.
第二个是一个函数表达式,并解释知道,因为它是一个分配的右手边的一部分,因为它周围的括号.每当这个单词function
出现在其他某个"值"(或"表达式")可能被提供的地方时,你所拥有的就是一个函数表达式.该表达式的结果是对函数体的引用.
函数表达式的名称(如果它被赋予一个)仅在函数中可用,如链接中所述.
恕我直言,该链接的命名是不正确的.在我看来,他们所谓的"命名匿名函数"应该被称为"命名函数表达式".这个明显的错误可能源于所有匿名函数实际上都是函数表达式,但并非所有函数表达式都是匿名的.
请注意,如果您使用此样式:
var foo = function bar() {
...
}
Run Code Online (Sandbox Code Playgroud)
然后如上所述bar
是一个函数表达式,然后将其结果赋值给变量foo
.该名称bar
未放入当前范围,但在函数本身中可用.
变量的声明foo
将被提升到作用域的顶部,但是在实际执行上面的行之前,不会为其赋值(即对函数表达式的引用).
另一个有趣的示例是(从Chrome控制台):
> function() { }
SyntaxError: Unexpected token (
> a = function() { }
function () { }
Run Code Online (Sandbox Code Playgroud)
请注意,唯一的区别是后者有一个赋值a
.尝试使用语句声明匿名函数是非法的,因为语言语法要求函数语句包含函数的标签.然而,后者隐式地是一个函数表达式,允许它是匿名的.