为什么在赋值给变量后函数名称不可用

时间:2015-09-29 11:02:46

标签: javascript

我刚刚在一次采访中遇到过这个问题。我没有得到任何答案,所以把它放在StackOverflow

JS中的一个简单问题但我无法理解它背后的原因。以下是代码。

var f = function foo(a, b) {
    console.log(a + "-" + b); //f(1,2) will print 1-2
    //foo(1,2) is undefined.
}

现在如果我做f(1,2)那么它的效果非常好。

但是,如果我foo(1,2),则表示undefined function

为什么会这样?将函数赋值给js变量后,为什么函数不能调用函数?

2 个答案:

答案 0 :(得分:7)

There are two ways to declare functions.

功能声明:

function f(a,b) { }

功能表达:

var f = function(a,b) { }

在函数表达式中,您还可以指定"内部"功能名称如下:

var f = function foo(a, b) { }

名称foo只能在函数内部显示。这通常用于递归函数,以确保正确的自引用。

请参阅ECMAScript 5规范 section 13 ,了解函数声明和表达式之间的更多详细信息。

答案 1 :(得分:3)

对于命名函数表达式(这就是您所拥有的),名称foo仅在表达式本身中可用。

  

MDN:如果要引用函数体内的当前函数,则需要创建一个命名函数表达式。这个名称只对函数体(范围)是本地的。