函数是否是javascript对象属性的有效键?

函数是否是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; 警报(注

我想将函数用作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;
警报(注册表[Foo]+“<”+注册表[Bar]);

这是否包含在标准中?支持哪些浏览器?

放在方括号中的所有内容都转换为字符串,即使放函数、日期、regexp。。。在这里,您实际上创建了一个如下的对象:

var registry = {
    "function Foo(){  }" : 42,
    "function Bar(){  }" : 43
};
这是一种默认行为,如果你想知道的话,它在IE中也会起作用。它实际上是由约翰·雷西格在他的著作中利用的

ECMAScript 5.1-第11.2.1节:

生产
MemberExpression:MemberExpression[Expression]
的计算如下:

  • 让baseReference作为计算MemberExpression的结果
  • 让baseValue为GetValue(baseReference)
  • 让propertyNameReference作为表达式求值的结果
  • 让propertyNameValue为GetValue(propertyNameReference)
  • 调用CheckObjectImprovalible(baseValue)
  • 将propertyNameString设置为字符串(propertyNameValue)。
  • 如果正在计算的语法结果包含在严格模式代码中,则让strict为true,否则让strict为true 严格的要求可能是错误的
  • 返回一个Reference类型的值,其基值为基值,引用的名称为 propertyNameString,其严格模式标志为strict 因此,当使用
    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'