arguments.callee的替代方案

Mit*_*P91 8 javascript reflection porting arguments deprecated

我有一个EventListener,它监听整个文档并记录击键,但是我想在满足某些条件时删除这个监听器.

以下是我的代码片段:

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

这是有效的,但根据Mozilla Developer Docs,此方法已被弃用.

我知道我可以简单地命名这个函数,但有没有替代方法可以让我继续使用未命名的函数

Aad*_*hah 9

使用以下过程:

  • 创建一个变量
  • 为变量分配匿名函数
  • 使用变量引用调用它
  • 匿名函数使用变量名称引用自身

使用它如下:

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

document.addEventListener('keyup', foo);
Run Code Online (Sandbox Code Playgroud)

您可以使用y组合器轻松解决此问题:

function y(f) {
    return function () {
        return f.bind(null, y(f)).apply(this, arguments);
    };
}
Run Code Online (Sandbox Code Playgroud)

现在您可以按如下方式重写代码:

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);
}));
Run Code Online (Sandbox Code Playgroud)

这就是所有人.

  • 很酷的东西,但它没有回答标题中的问题。公平地说,标题是错误的。:) 但我实际上是在寻找 `arguments.callee` 的通用替代方案的答案,但这不是它。 (2认同)

Pau*_*tte 3

使用另一个匿名函数作为包装器将命名函数(被调用者填充程序)存储到原始函数中:

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);
Run Code Online (Sandbox Code Playgroud)

参考