2010-06-11 164 views
2
奇怪的行爲

我寫的代碼,這個和平:Chrome和Safari瀏覽器的Javascript

var a=function(){ 
}; 

a.name="test"; 
a.prop="test2"; 

現在,如果我調試與控制檯的代碼:

console.log(a.name); 
console.log(a.prop); 

在Firefox中,我得到a.name="test"a.prop="test2" ,而在Safari和Chrome我得到a.prop="test2",但​​。

似乎沒有辦法在Webkit瀏覽器中爲函數分配「name」屬性。你知道爲什麼嗎?但最重要的是,你知道一個解決方法嗎?

+0

確認5.0.375.70。我嘗試在'.function(){}'中分配.name,即使這樣也行不通。 – 2010-06-11 13:39:31

回答

6

功能情況有一個非標準name屬性,它會返回函數的名稱,或一個空字符串,如果該函數是匿名的(像你這樣)。當您嘗試寫入屬性時,瀏覽器的反應會不同,因此我建議使用另一個屬性名稱。

+0

我認爲你是對的。那麼沒有辦法解決這個問題了嗎? – mck89 2010-06-11 13:52:13

0

一些單詞在JS中保留,但一些瀏覽器仍然支持它們。

到這裏看看:http://www.quackit.com/javascript/javascript_reserved_words.cfm

+2

無關緊要。 'name'不是JavaScript中的保留字。問題是Function對象在某些瀏覽器中已經具有'name'屬性。 – 2010-06-11 13:41:45

+0

即使'name'是一個保留字,它也無關緊要,因爲您可以使用保留字作爲屬性名稱。 – 2010-06-11 13:47:19

0

你爲什麼要將屬性賦值給方法?這看起來應該是違反某些程序或慣例。如果你想要一個方法和屬性都可用,請創建一個新對象來包含它們。

+4

功能是對象,可以很高興地分配給它們的屬性。只要你避免試圖覆蓋諸如'name'這樣的內置屬性,這是一個完全可以接受的事情。 – 2010-06-11 13:43:10

0

看來您不能更改匿名/ lambda函數的名稱。如果您想設置名稱,則需要執行類似var a=function b() {}的操作,然後您可以設置名稱。

+0

我不這麼認爲。至少在Chrome中,名稱屬性仍然是隻讀的。 – 2010-06-11 13:49:34

0

正如你可以看到, 「名」 是不是一種選擇,那麼:

var a = function(){ 
}; 


a.props={name:"test",prop:"test2",anyKey:"anyValue"}; 

可能是一個解決辦法。

相關問題