2016-06-09 24 views
0

我在做一些練習在一本書中,我已經來到翻過這個例子:匿名函數名在瀏覽器中的行爲有所不同?

<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的行爲是預期的。

我的問題是這兩種行爲中的任何一種「正確的」,參照規範?

+1

什麼書?它是什麼時候寫的? – Bergi

+0

JavaScript忍者的祕密,2013年。 –

+1

在ES6中,函數名稱是從分配目標中推斷出來的。 –

回答

1

當您閱讀一本關於不斷變化的Web技術的書籍時,預計部分或全部信息會過期。

在ES5中,沒有爲function instances定義的name屬性,也沒有爲Function.prototype定義屬性。


在ES2015中,name屬性是爲function instances定義:

名稱屬性的值是一個字符串,是描述性的功能。該名稱沒有語義意義,但通常是一個變量或屬性名稱,用於在ECMAScript代碼中的定義點處引用該函數。該屬性具有{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}的屬性。

本規範沒有與它們關聯的上下文名稱的匿名函數對象沒有名稱自己的屬性,但繼承了%FunctionPrototype%的名稱屬性。

它也用於function.prototype定義:

函數原型對象的名稱屬性的值是空字符串。

還有稱爲SetFunctionName定義的算法,這似乎處理在各種情況下,當一個函數被用作對象文本的一部分,諸如分配一個name屬性。


這就像我挖的兔子洞一樣遠。如果Chrome和Firefox對SetFunctionName提供不同級別的支持,或者ES2015和ES2017規格之間存在差異,則導致您所看到的行爲,我不會感到驚訝。

3
  • 的ES5規範隻字未提.name的功能特性,因此它應該是undefined

  • (某些)瀏覽器仍將函數名稱實現爲一個功能,匿名函數沒有名稱,因此它應該是""。此外,開發人員工具會更聰明,併爲調試目的命名一些匿名函數(但不會給他們一個.name屬性)。

  • ES6規範提供了分配給變量a .name屬性的匿名函數表達式,所以它應該是"canFly"

現在自己選擇其中那些你認爲「正確」 :-)你的書可能會有點過時了,FF是在背後實施這一新功能ES6位。

+0

我完全忘了'.name'在ES5中並不是正式的東西...... –

+0

[這是一個spec鏈接](http:// www.ecma-international.org/ecma-262/6.0/#sec-function-instances-name),我正在挖掘'Function.prototype.name'屬性的定義。 – zzzzBov

+1

[這裏是原型規範鏈接](http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-the-function-prototype-object),看起來像匿名函數應該有一個每個規格的''''的名稱。 – zzzzBov

相關問題