比较javascript中的函数指针

时间:2012-07-13 03:18:40

标签: javascript pointers

有没有办法在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();

2 个答案:

答案 0 :(得分: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属性的任何名称。

如果你担心有多个数组,你可以在函数内部存储一种hashmap(JS中的被黑客攻击的对象,带有合适的键)。

答案 1 :(得分:2)

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

如果您做了类似下面的事情,那么您的支票会起作用,但我不确定它对您有多大用处。

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

   this.Add(loadedFn);
}

如果您想要更好的答案,请详细说明您要做的事情。