我正在书中做一些练习,而且我已经遇到了这个例子:
<html>
<body>
<script type="text/javascript">
var canFly = function() { return true;}
window.onload = function() {
console.log('Assert: "' + window.canFly.name+'"');
}
</script>
</body>
</html>
&#13;
然而,在Chrome 51和Firefox 46.0.1中执行时,我发现它们的行为有点不同。
即,当Firefox返回Assert: "canFly"
时,Chrome似乎会返回Assert: ""
。根据该书,Firefox的行为是预期的。
我的问题是这两种行为中的任何一种都是正确的&#39;一,参考规范?
答案 0 :(得分:4)
ES5规范没有说明函数的.name
属性,因此它应该是undefined
。
(某些)浏览器仍然将函数名称实现为功能,匿名函数没有名称,因此它应该是""
。此外,开发人员工具会更聪明,并为调试目的命名一些匿名函数(但不给它们.name
属性。)
ES6规范提供了分配给变量.name
属性的匿名函数表达式,因此它应该是"canFly"
。
现在选择你自己考虑的那些&#34;纠正&#34; :-)你的书可能有点过时,FF在实现这个新的ES6功能方面有点落后。
答案 1 :(得分:3)
我认为这是你的答案:Function "name" property (ES6)。
基本上,它是Chrome的DevTools的“聪明才智”,并且显然受到新JS标准的支持。
答案 2 :(得分:2)
当您阅读有关不断变化的网络技术的书籍时,预计部分或全部信息将会过时。
在ES5中,function instances没有定义name
属性,也没有为Function.prototype
定义属性。
在ES2015中,为function instances定义了name
属性:
name属性的值是一个描述函数的String。该名称没有语义意义,但通常是一个变量或属性名称,用于在ECMAScript代码中的定义点引用该函数。此属性具有{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}。
此规范没有与其关联的上下文名称的匿名函数对象没有名称拥有的属性,但继承了%FunctionPrototype%的名称属性。
它也是为function.prototype
定义的:
Function原型对象的name属性的值是空String。
还有一个名为SetFunctionName
的算法,它似乎可以处理在各种情况下分配name
属性,例如当函数用作对象文字的一部分时。
这就像我挖过兔子洞一样远。如果Chrome和Firefox对SetFunctionName
有不同程度的支持,或者ES2015和ES2017规范之间存在差异会导致您看到的行为,我不会感到惊讶。
答案 3 :(得分:0)
变量和方法可以从中推断出匿名函数的名称 它的句法位置(ECMAScript 2015中的新内容)。
var f = function() {};
var object = {
someMethod: function() {}
};
console.log(f.name); // "f"
console.log(object.someMethod.name); // "someMethod"
阅读inferred function names可能会有所帮助。