2013-03-05 70 views
7

將javascript函數作爲對象中的鍵是完全有效的嗎?在對象中有一個javascript函數作爲鍵是完全有效的嗎?

下工作,但我不知道它的100%(ECMA或任何身體管轄本)兼容

var f = function(){ 

}; 

var obj = {}; 

obj[f] = "a"; 


console.log(obj[f]); 
+3

我很好奇爲此看到一個實際的用例。 – 2013-03-05 09:35:29

+0

我會說這是毫無意義的。該函數很可能使用toString創建一個鍵['「function(){...}」]' – mplungjan 2013-03-05 09:38:54

+1

在發佈/子系統中跟蹤/註銷匿名用戶函數。不知道這是適合這份工作的數據結構,雖然 – 2013-03-05 09:40:15

回答

1

理由這樣做,因爲對象鍵在ECMAscript中可能只有字符串(目前,在ECMAscript 262第3版和第5版中,按規格)。

事情會然而,在的EcmaScript 6改變,在那裏我們將有WeakMaps對象鍵也可以對象(我不知道函數引用)。

即使瀏覽器可以通過功能參考現在區分對象鍵,它肯定是有問題的行爲,最有可能的實驗,不應該馬上使用。

7

它看起來像工作,但它可能無法按預期工作。作爲密鑰使用時

功能澆鑄到字符串:

var f = function(a) { return a; }; 
var obj = {}; 
obj[f] = 'abc'; 
console.log(JSON.stringify(obj)); 
//"{"function (a) { return a; }":"abc"}" 
console.log(f.toString()); 
//"function (a) { return a; }" 
var f2 = function (a) { return a; }; 
console.log(obj[f2]); 
//"abc" 

所以,函數f 1和f 2是不同的對象,但它們是相同的,當澆鑄字符串。

+1

雖然如果'f'和'f2'表現相同,因爲底層代碼是相同的,那麼它通常不是問題。 – 2015-01-21 10:53:46

+2

這可能是因爲他們是封閉的。它們可能具有相同的源代碼,可能由相同的外部函數生成,但它們將在閉包中綁定到不同的值。所以他們會**表現不同,但看起來一樣。 – SWilk 2015-02-20 09:27:53

1
var f = function(){ 

}; 
var obj = {}; 
obj[f] = "a"; 
console.log(obj['function(){\r\n\r\n}']); 
相關問題