16

関数を JavaScript オブジェクトのキーとして使用したいと思います。少なくともChromeでは、以下が機能します。

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

これは標準でカバーされていますか?どのブラウザでサポートされていますか?

4

2 に答える 2

17

角かっこの間に入れたものはすべて文字列に変換されます。これは、関数、日付、正規表現を入れても発生します...つまり、実際には次のようなオブジェクトを作成しています。

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

これはデフォルトの動作で、IE でも機能します。これは、John Resig の有名なaddEvent役職で実際に悪用されました。

于 2012-06-01T23:51:47.657 に答える
8

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 にします。そうでない場合は、strict を false にします。
  8. 基本値が base Value で、参照名が propertyNameString で、strict モード フラグが 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
})
于 2012-06-02T00:02:28.310 に答える