2012-06-01 8 views
11

私はjavascriptオブジェクトのキーとして関数を使用したいと思います。関数はjavascriptオブジェクトのプロパティの有効なキーですか?

var registry = {}; 
function Foo(){ }; 
function Bar(){ }; 
registry[Foo] = 42; 
registry[Bar] = 43; 
alert(registry[Foo] + " < " + registry[Bar]); 

これは標準でカバーされていますか?どのブラウザによってサポートされていますか?あなたは角括弧の間に置く

+0

まあは、Chromeで働いていました。だから、SafariとFirefoxでうまくいくかもしれない –

+0

私はそれがあなたに気づくようなものだと思うが、どういうわけかエンジンは文字列としてパースしているので...それはキャストしない限り良い考えではない – Sebas

+0

任意の種類の辞書クラスオブジェクトのキーには、正しく定義された==操作が必要です。このような操作は関数(http://en.wikipedia.org/wiki/Rice%27s_theorem)では定義できません。 –

答えて

14

すべてが文字列に変換され、これはあなたがそこに機能、日付、正規表現...だからを入れていても、あなたが実際にこのようなオブジェクトを作成しているが起こる:

var registry = { 
    "function Foo(){ }" : 42, 
    "function Bar(){ }" : 43 
}; 

これはデフォルト動作です。あなたが不思議に思っていたとしても、IEでは動作します。実際には彼のfamous addEvent functionでJohn Resigによって悪用されました。

+2

異なるクロージャを持つ関数を同じ文字列に変換して、同じプロパティにアクセスできることに注意してください。 ノードコンソールから: > var maker = function(a){return function(){console.log(a); }; }; > VAR BB =メーカー( 'BB') > BB() BB>変数のCC =メーカー( 'DD') > CC() DD> VARテスト= {}; >試験[BB] = 'AA' 'AA' >試験[BB] 'AA' > BB() BB>試験 {「関数(){にconsole.log(A)。 } ':' AA '} > test [cc] =' DD ' ' DD ' >テスト {' function(){console.log(a);} } ':' DD '} >テスト[bb] ' DD ' >テスト[cc] ' DD ' – JoeAndrieu

4

のECMAScript 5.1 - セクション11.2.1:次のように

生産MemberExpression : MemberExpression [ Expression ]が評価されています

  1. はbaseReferenceがMemberExpressionを評価した結果とします。
  2. baseValueをGetValue(baseReference)とします。
  3. PropertyNameReferenceをExpressionを評価した結果とします。
  4. propertyNameValueをGetValue(propertyNameReference)とします。
  5. CheckObjectCoercible(baseValue)を呼び出します。
  6. propertyNameStringをToString(propertyNameValue)にします。
  7. 評価中の構文プロダクションが厳密なモードコードに含まれている場合はstrictをtrueにし、そうでなければ をfalseにします。
  8. 基本値が基本値で、参照名が propertyNameStringで、厳密モードフラグがstrictであるReference型の値を返します。

obj[whatever]を使用するときに、whateverを文字列に変換されます。関数の場合、これは関数のソースコードを含む文字列になります。

例:

js> var func = function() { return 'hi'; }; 
js> function helloworld() { return 'hello world'; } 
js> var obj = {}; 
js> obj[func] = 123; 
js> obj[helloworld] = 456; 
js> obj 
({'function() {\n return "hi";\n}':123, 
    'function helloworld() {\n return "hello world";\n}':456 
}) 
関連する問題