3 回答
TA贡献1895条经验 获得超3个赞
问题
您正在使用已命名的函数表达式 -函数表达式的名称在该函数范围之外不可用:
// 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泄漏到封闭范围内。将命名函数表达式分配给变量只是这种情况的一种特殊情况,它恰好看起来像函数语句声明。
TA贡献1799条经验 获得超6个赞
addNums是只在新定义函数的范围内都有效。
很明显,当函数表达式具有名称(技术上称为标识符)时,它称为命名函数表达式。您在第一个示例中看到的内容– var bar = function foo(){}; —就是那个—命名函数表达式,其中foo是函数名称。要记住的一个重要细节是,该名称仅 在新定义的函数范围内可用;specs规定标识符不能用于封闭范围。
阅读本文的更多详细信息。
添加回答
举报