为什么javascript中的匿名函数有名字?

时间:2017-07-17 14:37:50

标签: javascript anonymous-function

我正在读一本名为“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"

分配给变量的匿名函数在前几天没有名称吗?如果是这样,发生了什么变化?或者作者犯了错误?

2 个答案:

答案 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中的新内容)。

所以它返回名称但是,当它不能时,它会尝试猜测。