以下是代码示例:
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
答案 0 :(得分:1)
是的,Function.prototype.toString
有一些神奇之处:它依赖于实现,它只需要返回函数的表示形式FunctionDeclaration - 类似于语法。当然,它不能为所有那些环境内置函数(如console.log
)返回JS函数。
但是,我认为根据字符串表示法识别函数并不是一个好主意。很容易发生两个不同的函数最终出现在同一个字符串中(例如:两个相同的函数表达式,不同作用域中相同的函数声明 - 或闭包,内置函数(Array.prototype.toString.toString() == Function.prototype.toString.toString()
)。
相反,请为eventStack
使用数组,并通过indexOf()
检查函数是否存在。
答案 1 :(得分:0)
属性名称只能是字符串。其他类型根据需要强制转换为字符串值。当您使用for ... in
迭代属性时,您将获得字符串。