1

有什么方法可以比较javascript中的函数指针吗?基本上,我想看看我是否多次将相同的函数添加到数组中,然后只添加一次。是的,我可以围绕它进行编程,但这样做会容易得多。

下面的代码不使用数组,但说明了我试图提出的观点。我希望仅在 myPointer 是不同的函数时才设置 oldPointer 。

这是一些示例代码:

function test()
{
}


test.prototype.Loaded = function()
{
   this.loaded = true;
}

test.prototype.Add = function(myPointer)
{
    if (this.oldPointer != myPointer)  //never the same
    {
      this.oldPointer = myPointer;
    }
}

test.prototype.run = function()
{
   this.Add(this.Loaded.bind(this));

   this.Add(this.Loaded.bind(this));  //this.oldPointer shouldn't be reassigned, but it is
}

var mytest = new test();
test.run();
4

2 回答 2

2

如果您的问题是“我如何有效地避免将相同的函数添加到给定数组两次?” 围绕它进行编程的最简单方法显然是:

// Add f to a if and only if it is not already in a
if (a.indexOf(f) < 0) {
    a.push(f);
}

如果 的线性复杂性indexOf困扰您,并且您只关心单个数组,您可以非常花哨并将函数加载到函数本身的事实存储:

// Add f to a if and only if it is not already in a
if (! f.alreadyAddedToA) {
    a.push(f);
    f.alreadyAddedToA = true;
}

为 hack 属性选择任何名称。

如果您担心有多个数组,您可以在函数内部存储一种哈希图(JS 中的黑客对象,具有合适的键)。

于 2012-07-13T03:32:15.727 回答
2

假设 bind 是一个函数,它使用 Function.apply() 创建一个函数闭包绑定this到上下文,this.Loaded.bind(this)每次调用它都会产生一个新函数。这就是您的代码不起作用的原因。不幸的是,无法this.Loaded从 bind() 生成的函数对象中引用,因此无法进行比较。

相反,如果您执行以下类似操作,则您的检查将起作用,尽管我不确定它对您有多大用处。

test.prototype.run = function()
{
   var loadedFn = this.Loaded.bind(this);
   this.Add(loadedFn);

   this.Add(loadedFn);
}

如果您想要更好的答案,请准确说明您要做什么。

于 2012-07-13T03:42:03.017 回答