像 "var foo = function bar() ..."这样的 Javascript 函数?

标签 javascript function

代码是这样的(语法可能看起来很奇怪,但据我所知,它没有任何问题。或者有什么问题?)

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/

相关文章:

javascript - 如何将 javascript 函数存储在队列中以便最终执行

javascript - 如何在移动网络中以高于7700 Hz的频率录制声音?

javascript - 图像作为 html 按钮

javascript - 将 IP 与存储在数组中的范围进行匹配

javascript - 有人能解释一下这个简单函数中字母 'm' 究竟代表什么吗?

function - 执行函数后如何退出 lisp 中的循环?

javascript - 有没有办法停止多次调用一个函数?

scala - 在 Scala 中使用函数映射实例

javascript - 为搜索到的键/值对返回 bool 值的最简单方法 (Javascript)

javascript - Jquery事件捕获margin-left的变化