比较javascript中的函数指针

比较javascript中的函数指针,javascript,pointers,Javascript,Pointers,有没有办法比较javascript中的函数指针?基本上,我想看看我是否已经将同一个函数多次添加到数组中,然后只添加一次。是的,我可以用自己的方式来编程,但这样做会容易得多 下面的代码没有使用数组,但说明了我试图表达的观点。我希望仅当myPointer是另一个函数时才设置oldPointer 下面是一些示例代码: function test() { } test.prototype.Loaded = function() { this.loaded = true; } test.pro

有没有办法比较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();
如果您的问题是“如何有效地避免将同一函数添加到给定数组中两次?”那么围绕该函数编程的最简单方法显然是:

// Add f to a if and only if it is not already in a
if (a.indexOf(f) < 0) {
    a.push(f);
}
为hack属性选择任意名称

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

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

// Add f to a if and only if it is not already in a
if (a.indexOf(f) < 0) {
    a.push(f);
}
为hack属性选择任意名称


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

假设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);
}

如果您想得到更好的答案,请明确说明您正试图做什么。

假设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);
}


如果你想要一个更好的答案,请明确说明你想做什么。

你能再提供一点伪代码吗?我不完全确定你想做什么。阵列在哪里?你在整个事情中没有一个数组。另外,如果只是运行test.run(),为什么要声明mytest?数组不是重点。上面的代码说明了我正在尝试做什么。我不同意。数组就是您想要的。您要确保在现在之前没有将其添加到阵列中。不管怎么说,您已经有了答案,所以我不必为琐碎的实现细节操心。您能再提供一点伪代码吗?我不完全确定你想做什么。阵列在哪里?你在整个事情中没有一个数组。另外,如果只是运行test.run(),为什么要声明mytest?数组不是重点。上面的代码说明了我正在尝试做什么。我不同意。数组就是您想要的。您要确保在现在之前没有将其添加到阵列中。不管怎样,你已经有了答案,所以我不必为琐碎的实现细节操心。
bind
已经在
Function
()中了,但无论如何你是对的。哎呀,我不知道Function.bind存在。很高兴知道。谢谢,谢谢。我不知道bind每次被调用时都会生成一个新函数。然而,您的示例并不能解决我的问题,因为Add在同一个函数中出现两次只是为了便于说明。如果我叫“跑”两次怎么办?基本上,无论调用run多少次,我都希望这个.oldPointer只分配一次。有什么想法吗?您可以修改Add以接受上下文而不绑定,因此它将是
test.prototype.Add=function(myPointer,context)
。在Add中存储这两个值并分别比较它们,并在以后需要执行函数时绑定上下文。还有许多其他的选择,包括存储额外的信息或修改代码模式,最好的解决方案取决于您正在尝试做什么。但是,最好避免出现需要执行此检查的情况,只需确保不使用相同的函数调用Add两次即可。如果不使用bind,则可能就是答案,谢谢。我来试一试。
bind
已经在
Function
()中了,但无论如何你是对的。哎呀,我不知道Function.bind存在。很高兴知道。谢谢,谢谢。我不知道bind每次被调用时都会生成一个新函数。然而,您的示例并不能解决我的问题,因为Add在同一个函数中出现两次只是为了便于说明。如果我叫“跑”两次怎么办?基本上,无论调用run多少次,我都希望这个.oldPointer只分配一次。有什么想法吗?您可以修改Add以接受上下文而不绑定,因此它将是
test.prototype.Add=function(myPointer,context)
。在Add中存储这两个值并分别比较它们,并在以后需要执行函数时绑定上下文。还有许多其他的选择,包括存储额外的信息或修改代码模式,最好的解决方案取决于您正在尝试做什么。但是,最好避免出现需要执行此检查的情况,只需确保不使用相同的函数调用Add两次即可。如果不使用bind,则可能就是答案,谢谢。我来试一试。js中的所有本机对象都是hashmapsDoesn,这不就是一个简单的例子吗?indexOf(f)在引擎盖下使用==因此如果==不起作用,indexOf将始终返回-1您使用的第二个示例起作用,bu