代码是这样的(语法可能看起来很奇怪,但据我所知,它没有任何问题。或者有什么问题?)
var add=function addNums(a, b) {
return a+b;
}
alert("add: "+ add(2,3)); // produces 5
alert("addNums: "+addNums(2,3)); // should also produce 5
addNums()
被声明为一个函数。所以,当我将参数传递给它时,它也应该返回结果。
那么,为什么我没有收到第二个警告框?
最佳答案
您看到的是 named function expression (NFE) .
匿名函数表达式是您将没有名称的函数分配给变量的地方1:
var add = function () {
console.log("I have no own name.");
}
命名函数表达式是您将命名函数分配给变量的地方(惊喜!):
var add = function addNums() {
console.log("My name is addNums, but only I will know.");
}
函数的名称仅在函数本身内可用。这使您能够在不必知道函数的“外部名称”的情况下使用递归 - 甚至不必首先设置一个(想想回调函数)。
您选择的名称隐藏 现有名称,因此如果在别处定义了另一个addNums
,它不会被覆盖。这意味着您可以使用任何您喜欢的名称,而不必担心范围界定问题或破坏任何内容。
在过去你会使用 arguments.callee
在不知道其名称的情况下引用其自身内部的函数。但是 JavaScript2 正在移除对此的支持,因此 NFE 现在是执行此操作的正确方法。
这里有很多关于该主题的内容可供阅读:http://kangax.github.io/nfe/
1 没有必要将它赋给一个变量,它只是作为一个例子来区别于普通的函数声明。它可以是 JS 期望表达式(例如函数参数)的任何其他上下文。
2 如果您有 strict mode,您将收到错误消息实际上并尝试使用 arguments.callee
。
关于像 "var foo = function bar() ..."这样的 Javascript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16631708/