2013-03-05 4 views
7

オブジェクトのキーとしてjavascript関数を使用することは完全に有効ですか?オブジェクトのキーとしてjavascript関数を持つことは完全に有効ですか?

以下の作品が、私はわからないんだけどそれは100%(ECMAまたは任意の体はこれを支配する)に準拠し

var f = function(){ 

}; 

var obj = {}; 

obj[f] = "a"; 


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

私は非常に興味深いことに、このケースを見ています。 –

+0

私はそれが意味がないと言うでしょう。この関数は、toStringを使用して、[["function(){...}"] ' – mplungjan

+1

のキーを作成し、パブ/サブシステム内の匿名サブスクライバ関数の追跡/登録解除を維持する可能性があります。しかし、これが正しいデータ構造であることは確かではありません。 –

答えて

1

オブジェクトキー以来のことを行うにはゼロ理由が、ありますECMAscriptでは文字列(当分の間は、ECMAscript 262 edition 3と5、仕様別)である可能性があります。我々はまた、オブジェクト(私は関数参照についてはよく分からない)することができWeakMapsオブジェクトキーを持っていますどこ

物事は、ECMAスクリプト6にただし変更されます。

ブラウザがオブジェクトのキーをファンクションリファレンスで区別できる場合でも、疑いのある振る舞い、おそらく実験的であり、今すぐ使用すべきではありません。

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とf2は異なるオブジェクトですが、文字列にキャストするとき、彼らは同じです。

+1

'f'と' f2'が基本的なコードが同じであるため同じ動作をするのであれば、しばしば問題にはなりません。 –

+2

閉鎖されている可能性があります。それらは同じソースコードを持ち、同じ外部関数によって生成されるかもしれませんが、クロージャの異なる値にバインドされます。だから、彼らは**違ったふうに動作しますが、同じように見えます。 – SWilk

1
var f = function(){ 

}; 
var obj = {}; 
obj[f] = "a"; 
console.log(obj['function(){\r\n\r\n}']); 
関連する問題