在JavaScript中唯一标识函数

在JavaScript中唯一标识函数,javascript,Javascript,是否有任何方法可以唯一地标识函数而不给它expando属性?我只是使用“toString()”来标识函数,但当两个函数相同时,它们会冲突 下面的示例代码再现了该问题。在我的实际代码中,关联数组“myfunctions”的键也是从其他参数构建的。我不想生成一个无意义的密钥,因为使用此代码的开发人员需要能够在任何时候重建此密钥,而无需持有对某个随机密钥的引用 var myfunctions = {}; (function(){ var num = 1; function somef

是否有任何方法可以唯一地标识函数而不给它expando属性?我只是使用“toString()”来标识函数,但当两个函数相同时,它们会冲突

下面的示例代码再现了该问题。在我的实际代码中,关联数组“myfunctions”的键也是从其他参数构建的。我不想生成一个无意义的密钥,因为使用此代码的开发人员需要能够在任何时候重建此密钥,而无需持有对某个随机密钥的引用

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;