函数是否是javascript对象属性的有效键?
我想将函数用作javascript对象中的键。至少在Chrome中,以下工作:函数是否是javascript对象属性的有效键?,javascript,Javascript,我想将函数用作javascript对象中的键。至少在Chrome中,以下工作: var registry = {}; function Foo(){ }; function Bar(){ }; registry[Foo] = 42; registry[Bar] = 43; alert(registry[Foo] + " < " + registry[Bar]); var注册表={}; 函数Foo(){}; 函数条(){}; 注册表[Foo]=42; 注册表[Bar]=43; 警报(注
var registry = {};
function Foo(){ };
function Bar(){ };
registry[Foo] = 42;
registry[Bar] = 43;
alert(registry[Foo] + " < " + registry[Bar]);
var注册表={};
函数Foo(){};
函数条(){};
注册表[Foo]=42;
注册表[Bar]=43;
警报(注册表[Foo]+“<”+注册表[Bar]);
这是否包含在标准中?支持哪些浏览器?放在方括号中的所有内容都转换为字符串,即使放函数、日期、regexp。。。在这里,您实际上创建了一个如下的对象:
var registry = {
"function Foo(){ }" : 42,
"function Bar(){ }" : 43
};
这是一种默认行为,如果你想知道的话,它在IE中也会起作用。它实际上是由约翰·雷西格在他的著作中利用的
ECMAScript 5.1-第11.2.1节:
生产MemberExpression:MemberExpression[Expression]
的计算如下:
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
})
嗯,在Chrome工作过。因此,它可能在Safari和Firefox中工作。我认为这就像你警告一个函数,引擎以某种方式将其解析为字符串,因为它是允许的。。。但是我想说这不是一个好主意,除非你自己把它转换成一个字符串(我想知道是否可能),任何类型的字典类对象的键都必须有一个定义良好的==操作。不能为函数()定义这样的操作。@RobertHensing如果是这样,那么
addEventListener
和removeventlistener
如何工作addEventListener
不会为同一事件添加两次相同的回调。显然,removeEventListener
需要识别被删除的回调。我不理解赖斯定理,但在我看来,函数可以表示为指针。为什么不用这个?更新:object类型的键也不起作用。请注意,具有不同闭包的函数可以转换为相同的字符串,并访问相同的属性。从节点控制台:>var maker=function(a){return function(){console.log(a);};};};>var bb=maker('bb')>bb()bb>var cc=maker('dd')>cc()dd>var test={};>test[bb]='AA''AA'>test[bb]'AA'>bb>test{'function(){console.log(a);}':'AA'}>test[cc]='DD'>test{'function(){console.log(a);}':'DD'>test[bb]'DD'>test[cc]'DD'