2015-02-10 185 views
0

我有一個名爲函數象下面這樣:重寫name屬性

var foo = function ninjaFunc(){ 

}; 

在控制檯檢查它的名字,我發現「ninjaFunc」預計:

console.log(foo.name); //-> "ninjaFunc" 

我只是重新分配foo.name'aha'。它運行沒有任何錯誤。

foo.name = 'aha'; //compiles without error 

但重新檢查foo.name,我再次發現「ninjaFunc」。但是我期望它會成爲「aha」,因爲編譯器在確定它時沒有提出錯誤。

console.log(foo.name); //-> "ninjaFunc" 

爲什麼這麼說?我錯過了哪個概念?

+0

[MDN:function.name](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name)'[...]您無法更改名稱[...]'('這是一項實驗技術,是ECMAScript 6(Harmony)提案的一部分.') – 2015-02-10 11:59:49

+0

但是爲什麼它在我嘗試改變?像我的例子中的foo.name ='aha'。 – 2015-02-10 12:01:24

+1

因爲設置不可寫屬性不需要拋出一個錯誤:[jsfiddle demo](http://jsfiddle.net/s8sceLnp/) – 2015-02-10 12:05:27

回答

-1

ECMAScript的規範性參考是ECMA-262,即語言規範。目前的標準ES5沒有指定名稱屬性爲function instances

然而,6版的草案確實在§19.2.4.2

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.

它說你不能寫它(可寫:假)每§6.1.7.1

實現可能已經實現了ed。 6行爲,還是不行。您需要測試各種瀏覽器以確定支持(例如,IE 6以及更高版本中不支持)。

+0

嘿,你剛剛從原型屬性引用它。我檢查了其中提到的屬性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}的名稱部分。 – 2015-02-10 14:03:12

+0

'[']可以寫入(可寫:true),但不能修改(可配置:false),如§6.1.7.1中定義。所以寫入它並不會拋出錯誤,但它也沒有做任何事情。[...]'錯了。 'configurable:false'將保護屬性描述符和屬性表單被刪除,但不會影響它是否可寫。只設置'writable:false'(或使用setter)可以保護屬性不被覆蓋。如果腳本以_嚴格模式運行,則刪除「可配置:false」屬性會引發錯誤,寫入「writable:false」會引發錯誤。 – 2015-02-10 19:10:16

+0

@ Md.ArafatAlMahmud-是的,你說得對,我從錯誤的部分引用,修正。 – RobG 2015-02-11 03:40:22