问题
您正在使用命名函数表达式- 并且函数表达式的名称在该函数的范围之外不可用:
// Function statement
function statement() {
console.log("statement is a type of " + typeof statement);
}
statement();
console.log("statement is a type of " + typeof statement);
结果是:
statement is a type of function
statement is a type of function
然而:
// Function expression with a name
var expression = function namedExpression() {
console.log("namedExpression is a type of " + typeof namedExpression);
};
expression();
// namedExpression(); // uncommenting this will cause an exception
console.log("expression is a type of " + typeof expression);
console.log("namedExpression is a type of " + typeof namedExpression);
将产生:
namedExpression is a type of function
expression is a type of function
namedExpression is a type of undefined
解决方案
根据您尝试执行的操作,您希望执行以下操作之一:
更改您的函数声明以使用语句,然后为您的函数设置别名:
function addNums(a, b) {
return a + b;
}
var add = addNums;
将这两个名称别名到您的表达式中:
var add = addNums = function addNums(a, b) {
return a + b;
};
为什么 JavaScript 以这种方式做事?
命名函数表达式很有用,因为它们允许您在其内部引用函数,并且它们为您提供一个名称以供在调试器中查看。但是,当您将函数用作值时,您通常不希望它的一部分泄漏到封闭范围中。考虑:
(function setup() {
var config = retrieveInPageConfig();
if (config.someSetting) {
performSomeOtherSetup();
}
kickOffApplication();
})();
这是函数表达式的完全合法使用 - 在这种情况下,您不会期望名称setup
泄漏到封闭范围中。将命名函数表达式分配给变量只是这种情况的一个特例,它恰好看起来像一个函数语句声明。