arguments.callee的替代方案

10
我有一个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开发者文档,这个方法已经被弃用了。

我知道我可以给函数命名,但是否有其他替代方法可以继续使用未命名函数


不,你必须以某种方式存储对它的引用,就像 arguments.callee 一样。 - Joe Simmons
你为什么坚持使用匿名函数? - user2736012
@user2736012 这个问题更多是出于好奇而非实际应用。 - MitulP91
不,除了使用匿名函数的变量引用之外,没有其他方法。如果有的话,那只是多余的。 - user2736012
2个回答

15

按照以下步骤进行:

  • 创建一个变量
  • 将匿名函数赋给该变量
  • 使用变量引用调用该函数
  • 匿名函数通过变量名引用自身

使用方法如下:

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

就这样吧,伙计们。


这跟 function y(f) { return function yf() { return f.bind(null, yf).apply(this, arguments) 不一样吗? - user663031
是的,但是OP问题的整个重点在于不使用命名函数。 - Aadit M Shah
2
很酷的东西,但它并没有回答标题中的问题。公平地说,标题是错误的。 :) 但我实际上正在寻找一个arguments.callee的通用替代方案的答案,而这不是它。 - Stijn de Witt
JavaScript是一种奇怪的语言,感谢这个解决方案!我不知道那是可能的。 - rez

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);

参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接