在JavaScript中唯一标识函数
是否有任何方法可以唯一地标识函数而不给它expando属性?我只是使用“toString()”来标识函数,但当两个函数相同时,它们会冲突 下面的示例代码再现了该问题。在我的实际代码中,关联数组“myfunctions”的键也是从其他参数构建的。我不想生成一个无意义的密钥,因为使用此代码的开发人员需要能够在任何时候重建此密钥,而无需持有对某个随机密钥的引用在JavaScript中唯一标识函数,javascript,Javascript,是否有任何方法可以唯一地标识函数而不给它expando属性?我只是使用“toString()”来标识函数,但当两个函数相同时,它们会冲突 下面的示例代码再现了该问题。在我的实际代码中,关联数组“myfunctions”的键也是从其他参数构建的。我不想生成一个无意义的密钥,因为使用此代码的开发人员需要能够在任何时候重建此密钥,而无需持有对某个随机密钥的引用 var myfunctions = {}; (function(){ var num = 1; function somef
var myfunctions = {};
(function(){
var num = 1;
function somefunc() {
alert(num);
}
myfunctions[somefunc.toString()] = somefunc;
})();
(function(){
var num = 2;
function somefunc() {
alert(num);
}
myfunctions[somefunc.toString()] = somefunc;
})();
for (var f in myfunctions) {
myfunctions[f]();
}
运行此代码时,只会触发一个警报,并且始终显示消息“2”。答案是“否”,您无法从函数中提取任何唯一的字符串值来关联特定实例
为什么要避免使用expando?我怀疑在属性名(不是散列键,而是属性名)中输入的任何内容都会转换为字符串 这也不行
(function(){
var num = 1;
function somefunc() {
alert(num);
}
somefunc.blah = 1;
myfunctions[somefunc] = somefunc;
})();
(function(){
var num = 2;
function somefunc() {
alert(num);
}
somefunc.bloh = 1;
myfunctions[somefunc] = somefunc;
})();
我刚刚做了一些,似乎属性名只能是字符串。这是事件模型的一部分,是出售给第三方开发人员的更大API的一部分。我不想修改它们的函数,即使只是添加一个属性来标识函数。然而,如果这是我唯一的办法,那么我将不得不使用expando。感谢阅读并回答我的问题!但是“expando”项目能让它工作吗?我不这么认为,你能告诉我你是怎么做的吗?Thanks@Victor-我在下面的回答中添加了一条评论。请使用expando作为键。myfunctions[somefunc.blah]=somefunc;