在JavaScript中唯一标识函数

时间:2009-10-27 13:39:32

标签: javascript

有没有什么办法可以在不给它一个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”。

2 个答案:

答案 0 :(得分:2)

答案是否定的,没有任何唯一的字符串值可以从一个可以与该特定实例关联的函数中绘制。

为什么要避免使用expando?

答案 1 :(得分:0)

我怀疑无论你放入属性名称(不是散列键,属性名称),无论如何都将转换为字符串。

这不起作用

(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;
})();

我刚做了一些reading,看起来属性名称只能是一个字符串。