如果var a = function b(){}会发生什么

时间:2017-12-09 11:58:38

标签: javascript

所以我正在阅读javascript函数,其中我发现有两种方法首先编写函数

function b(){console.log("name")}

如果我写b.name,它给b

,第二种方式是使用

var a = function() {console.log("name")}

如果我写a.name,它会给出一个

所以我的问题是当我们写这样的函数时会发生什么

var a =function b(){console.log("name")}

在这种情况下,如果我致电a(); 它会工作正常 如果我拨打b();,则会显示错误 但如果我写a.name它就会告诉我b。请有人帮我理解吗?

2 个答案:

答案 0 :(得分:3)

var a =function b(){console.log("name")}

...因为您在函数表达式中指定了一个名称,该名称成为函数的名称(例如,a.name将返回"b" [与b.name *一样,当然,因为ab指的是同一个函数])。仅当函数表达式没有赋值时,才会从赋值表达式中推断出(如果可能)名称。

(请注意,推断使用匿名函数表达式创建的函数的函数名称相对较新,这是ES2015中添加的一项功能。另请注意,函数的name属性在此之前未正式添加。)

以下是所有演示的内容:



function b1() {
  console.log("[inside] b1.name = " + b1.name);
}
console.log("b1.name = " + b1.name);
b1();

var a1 = function() {
  console.log("[inside] a1.name = " + a1.name);
};
console.log("a1.name = " + a1.name);
a1();

var a2 = function b2() {
  console.log("[inside] b2.name = " + b2.name);
};
console.log("a2.name = " + a2.name);
a2();




*如果您在b范围内使用它。它不在函数范围之外,但它是里面函数。这是因为当您使用命名函数表达式(而不是函数声明)时,函数的名称不会添加到定义表达式的范围内(而使用函数声明时,它是) 。但该名称仍然在范围内的函数中。

答案 1 :(得分:2)

如果您检查功能的名称(键入a.name),您将收到"b"

显然function关键字后面的标识符是函数的名称,赋值前的标识符是对函数的引用。

如果未指定任何分配(即您的第一个示例 - function b() {}没有var a =),则名称本身将成为引用(对象b将具有对该引用的引用功能)。