我正在读一本名为“JavaScript Ninja的秘密”的好书,由John Resig撰写。熊Bibeaoult。在第3.2章中,它给出了一个例子;
var canFly = function(){ return true; };
然后它说;
创建匿名函数并将其分配给名为canFly的全局变量。由于JavaScript的功能特性,可以通过此引用调用该函数作为canFly()。在这方面,它几乎在功能上等同于声明一个名为“canFly”的命名函数,但并不完全相同。 一个主要区别是函数的name属性是“”,而不是“canFly”。
但是当我尝试在Chrome的开发者工具上执行该示例并检查name
函数的canFly
属性时,它返回值“canFly”而不是空字符串。
canFly.name;
// > "canFly"
分配给变量的匿名函数在前几天没有名称吗?如果是这样,发生了什么变化?或者作者犯了错误?
答案 0 :(得分:2)
理论上,匿名函数是不对称的,意思是无名的。这就是它最初实施的方式,十多年来,每个人都很好。
然后发生了两件事:整个Web2.0 / ajax运动,人们开始实现网页和node.js桌面应用程序中常见的UI功能。这两个组合迫使越来越多的开发人员将javascript视为一种严肃的语言,一旦人们对javascript感到满意,他们就开始编写非常大的代码库。
这引发了对javascript可调试性的抱怨。有很多没有任何有用的调试器(这导致我们在浏览器中非常好的调试器,我认为仅次于MS Visual Studio)不知道console.log来自哪个函数(因为它们是匿名的)
这导致浏览器和js引擎开发人员实现了试图猜测无名函数“名称”的代码。
理论上这个特性是错误的,因为你不能总是保证你猜测的名字是如何调用函数的(例如,如果函数被分配给几个不同的变量)。在实践中,90%的时间工作的东西总比没有任何东西好。
答案 1 :(得分:1)
这是一个稍微调整过的测试代码版本,它提供了.name
可能只是努力提供帮助的线索:
var canFly = function () {};
var areYouSure = function yesIAm(){};
console.log(canFly.name);
console.log(areYouSure.name);
console.log((function (){}).name);

在MDN检查详细信息,我们可以看到它曾经是非标准属性:
function.name
属性返回函数的名称。
......进入ES2015(强调我的):
变量和方法可以从其句法位置推断匿名函数的名称(ECMAScript 2015中的新内容)。
所以它返回名称但是,当它不能时,它会尝试猜测。