所以我正在阅读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。请有人帮我理解吗?
答案 0 :(得分:3)
在
var a =function b(){console.log("name")}
...因为您在函数表达式中指定了一个名称,该名称成为函数的名称(例如,a.name
将返回"b"
[与b.name
*一样,当然,因为a
和b
指的是同一个函数])。仅当函数表达式没有赋值时,才会从赋值表达式中推断出(如果可能)名称。
(请注意,推断使用匿名函数表达式创建的函数的函数名称相对较新,这是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
将具有对该引用的引用功能)。