问题
您正在使用命名函数表达式- 函数表达式的名称在该函数范围之外不可用:
// 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
泄漏到封闭范围内。将命名函数表达式分配给变量只是这种情况的一种特殊情况,它恰好看起来像函数语句声明。