繁体   English   中英

匿名函数名称在浏览器之间的行为有所不同吗?

[英]Anonymous function name behaves differently between browsers?

我在一本书中做了一些练习,并且遇到了这个例子:

 <html> <body> <script type="text/javascript"> var canFly = function() { return true;} window.onload = function() { console.log('Assert: "' + window.canFly.name+'"'); } </script> </body> </html> 

但是,在Chrome 51和Firefox 46.0.1中执行时,我意识到它们的行为有些不同。

即,Chrome似乎返回Assert: "canFly"而Firefox则返回Assert: "" 根据这本书,Firefox的行为是预期的。

我的问题是,参照规范,这两种行为都是“正确”的吗?

  • ES5规范没有说明函数的.name属性,因此应该undefined

  • (某些)浏览器仍将函数名称实现为功能,并且匿名函数将没有名称,因此应为"" 此外,开发人员工具会更聪明,并为调试目的命名一些匿名函数(但不要给它们提供.name属性)。

  • ES6规范为匿名函数表达式分配了.name属性,因此应为"canFly"

现在选择您认为是“正确”的那些书:-)您的书可能有点过时了,FF在实现此新ES6功能方面有些落后。

我认为这是您的答案: 函数“名称”属性(ES6)

基本上,它是Chrome DevTools的“智能”,而且显然是新的JS标准支持的行为。

当您读到有关不断变化的Web技术的书时,预计某些或全部信息将是过时的。

在ES5中,没有为函数实例定义name属性,也没有为Function.prototype定义。


在ES2015中,为函数实例定义了name属性:

name属性的值是一个描述函数的字符串。 该名称没有语义意义,但通常是变量或属性名称,用于在ECMAScript代码的定义点引用该函数。 此属性具有属性{[[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}。

没有与此规范关联的上下文名称的匿名函数对象不具有名称拥有的属性,而是继承%FunctionPrototype%的name属性。

它也为function.prototype定义:

Function原型对象的name属性的值为空String。

还有一个定义为SetFunctionName的算法,该算法似乎可以在各种情况下(例如,将函数用作对象文字的一部分时)分配name属性。


这是我挖到的兔子洞下的最深处。 我也不会感到惊讶,如果Chrome和Firefox曾经为不同级别的支持SetFunctionName或是出现了ES2015和ES2017的规格,这将导致你看到的行为之间的差异。

变量和方法可以从其语法位置推断出匿名函数的名称(ECMAScript 2015中的新增功能)。

var f = function() {};
var object = {
  someMethod: function() {}
};

console.log(f.name); // "f"
console.log(object.someMethod.name); // "someMethod"

阅读有关推断函数名称的信息可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM