有没有办法在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();
答案 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);
}
如果您想要更好的答案,请详细说明您要做的事情。