【问题标题】:Uniquely identify a function in JavaScript唯一标识 JavaScript 中的函数
【发布时间】:2023-03-31 18:41:01
【问题描述】:

有没有什么方法可以唯一标识一个函数而不给它一个 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”属性会使其工作吗?我不这么认为,你能发布一下你是怎么做到的吗?谢谢
  • @Victor - 我在下面为您的答案添加了评论。

标签: javascript


【解决方案1】:

我怀疑无论您在属性名称(不是哈希键,属性名称)中输入的任何内容都将转换为字符串。

这也不行

(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,似乎属性名只能是字符串。

【讨论】:

  • 使用 expando 作为键。 myfunctions[somefunc.blah] = somefunc;
【解决方案2】:

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

为什么要避免使用 expando?

【讨论】:

  • 这都是事件模型的一部分,它是出售给第 3 方开发人员的更大 API 的一部分。即使只是添加一个属性来识别功能,我也不想修改它们的功能。但是,如果这是我唯一的办法,那么我将不得不使用 expando。感谢您阅读并回答我的问题!
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2012-06-16
  • 2012-07-14
  • 1970-01-01
相关资源
最近更新 更多