可以使用函数作为对象属性名吗?

时间:2012-10-13 20:45:18

标签: javascript function

以下是代码示例:

var eventStack = {};
function addEvent (fn) {
  eventStack[fn] = fn;
}
function removeEvent (fn) {
  delete eventStack[fn];
}
addEvent(alert);
addEvent(console.log);
addEvent(addEvent);

它适用于我自己定义的任何函数,但不适用于console.log。相反,它被_firebugignore取代。

我认为toString属性有一些魔力

编辑 hmng,我只是再次运行我的代码,并且它在console.log上运行正常,上次键和值都被替换为“_firebuignore”,我想它的希格斯bugson

2 个答案:

答案 0 :(得分:1)

是的,Function.prototype.toString有一些神奇之处:它依赖于实现,它只需要返回函数的表示形式FunctionDeclaration - 类似于语法。当然,它不能为所有那些环境内置函数(如console.log)返回JS函数。

但是,我认为根据字符串表示法识别函数并不是一个好主意。很容易发生两个不同的函数最终出现在同一个字符串中(例如:两个相同的函数表达式,不同作用域中相同的函数声明 - 或闭包,内置函数(Array.prototype.toString.toString() == Function.prototype.toString.toString())。

相反,请为eventStack使用数组,并通过indexOf()检查函数是否存在。

答案 1 :(得分:0)

属性名称只能是字符串。其他类型根据需要强制转换为字符串值。当您使用for ... in迭代属性时,您将获得字符串。