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

あなたの質問が「特定の配列に同じ関数を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;
}

ハックプロパティの名前を選択してください。

気になる配列が複数ある場合は、関数内に一種のハッシュマップ(JSでハッキングされたオブジェクト、適切なキーを使用)を格納できます。

于 2012-07-13T03:32:15.727 に答える
2

thisbind が Function.apply() を使用してコンテキストへの関数クロージャ バインディングを作成する関数であると仮定すると、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 に答える