8

ドキュメント全体をリッスンしてキーストロークを記録するEventListenerがありますが、特定の条件が満たされたときにこの Listener を削除したいと考えています。

以下は私のコードのスニペットです:

document.addEventListener('keyup', function(e) {
    var letter_entered = String.fromCharCode(e.keyCode).toLowerCase();
    player.makeGuess(letter_entered);

    if(player.win_status === true || player.lose_status === true) {
        document.removeEventListener('keyup', arguments.callee, false);
    }
});

これは機能しますが、Mozilla Developer Docsによると、このメソッドは推奨されていません。

関数に名前を付けるだけでよいことは承知していますが、名前のない関数を引き続き使用できる代替手段はありますか?

4

2 に答える 2

14

次のプロセスを使用します。

  • 変数を作成する
  • 無名関数を変数に代入する
  • 変数参照で呼び出す
  • 無名関数は、変数名を使用して自分自身を参照します

次のように使用します。

   var foo = function(e)
    {
    "use strict";
    console.log(e);
    document.removeEventListener('keyup', foo, false);
    }

document.addEventListener('keyup', foo);

yコンビネータを使用すると、この問題を簡単に解決できます。

function y(f) {
    return function () {
        return f.bind(null, y(f)).apply(this, arguments);
    };
}

これで、コードを次のように書き直すことができます。

document.addEventListener("keyup", y(function (callee, e) {
    player.makeGuess(String.fromCharCode(e.keyCode).toLowerCase());
    if (player.win_status || player.lose_status) document
        .removeEventListener("keyup", callee);
}));

それはすべての人々です。

于 2013-12-06T07:33:13.340 に答える
3

別の匿名関数をラッパーとして使用して、名前付き関数 (callee shim) を元の関数に格納します。

document.addEventListener('keyup', (function(e)
  {
  var aFunction = function()
    {
    var letter_entered = String.fromCharCode(e.keyCode).toLowerCase();
    player.makeGuess(letter_entered);
    };

  if(player.win_status === true || player.lose_status === true) 
    {
    document.removeEventListener('keyup', window, false);
    }
  else
    {
    aFunction();
    }
  }
), false);

参考文献

于 2013-12-02T19:15:39.940 に答える