我想在javascript对象中使用函数作为键。以下工作,至少在Chrome中:
var registry = {};
function Foo(){ };
function Bar(){ };
registry[Foo] = 42;
registry[Bar] = 43;
alert(registry[Foo] + " < " + registry[Bar]);
这是否符合标准?它支持哪些浏览器?
答案 0 :(得分:15)
你放在方括号之间的所有东西都被转换成一个字符串,即使你放了一个函数,一个日期,一个正则表达式就会发生这种情况......所以,你实际上是在创建一个像这样的对象:
var registry = {
"function Foo(){ }" : 42,
"function Bar(){ }" : 43
};
这是一种默认行为,如果您想知道它也适用于IE。它实际上是由John Resig在他的famous addEvent
function中利用的。
答案 1 :(得分:6)
ECMAScript 5.1 - 第11.2.1节:
生产
MemberExpression : MemberExpression [ Expression ]
的评估如下:
- 让baseReference成为评估MemberExpression的结果。
- 让baseValue为GetValue(baseReference)。
- 让propertyNameReference成为评估Expression的结果。
- 让propertyNameValue为GetValue(propertyNameReference)。
- 调用CheckObjectCoercible(baseValue)。
- 让propertyNameString为ToString(propertyNameValue)。
- 如果正在评估的语法生成包含在严格模式代码中,则let strict为true,否则为let 严格要假。
- 返回类型为Reference的值,其基值为基值,其引用名称为 propertyNameString,其严格模式标志是严格的。
醇>
因此,当使用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
})