这个问题在这里已有答案:
我很好奇为什么命名函数表达式的name
属性是函数声明构造的名称的值,而不是可用于执行函数的变量。
function functionDeclaration(){
return;
}
var anonymousFunctionExpression = function(){
return;
}
var namedFunctionExpression = function functionName(){
return;
}
console.log(functionDeclaration.name);//As expected, function name is 'functionDeclaration'
console.log(anonymousFunctionExpression.name);//As expected, function name is 'anonymousFunctionExpression'
console.log(namedFunctionExpression.name);//Why is the function's name 'functionName' and not 'namedFunctionExpression?'
这就是它的工作原理。如果函数表达式中的函数被命名,那么将使用该名称(在=
的右侧) - 否则,如果没有命名,.name
将为您提供函数创建时分配给函数的变量名称。 (如果它是函数声明而不是函数表达式,那么.name
只是声明函数的名称。)
请注意,如果重新分配匿名创建的函数,则其name
仍为该函数所分配的原始变量名称。这是情况2中发生的情况,当解释器必须推断变量名称时:
const fn = () => {};
const fn2 = fn;
console.log(fn.name);
console.log(fn2.name);
在情况1和3中,解释器不需要推断变量名称,因为函数在定义时已经具有显式名称:
function functionDeclaration(){
// ^^^^^^^^^^^^^^^^^^^
return;
}
// and
var namedFunctionExpression = function functionName(){
return; ^^^^^^^^^^^^
}
解释器只会跟踪namedFunctionExpression
,如果它需要从其创建上下文(这是一个ES2015特性)infer函数名称 - 并且这种推断仅在情况2中完成。