返回指定函数变量名的命名JavaScript函数表达式的'name'属性背后的原因是什么? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我很好奇为什么命名函数表达式的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?' 
javascript function
1个回答
-2
投票

这就是它的工作原理。如果函数表达式中的函数被命名,那么将使用该名称(在=的右侧) - 否则,如果没有命名,.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中完成。

© www.soinside.com 2019 - 2024. All rights reserved.