Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 参数的替代方法。被调用方_Javascript_Reflection_Arguments_Deprecated_Porting - Fatal编程技术网

Javascript 参数的替代方法。被调用方

Javascript 参数的替代方法。被调用方,javascript,reflection,arguments,deprecated,porting,Javascript,Reflection,Arguments,Deprecated,Porting,我有一个EventListener,它侦听整个文档并记录击键,但我希望在满足某些条件时删除此侦听器 以下是我的代码片段: document.addEventListener('keyup', function(e) { var letter_entered = String.fromCharCode(e.keyCode).toLowerCase(); player.makeGuess(letter_entered); if(player.win_status === t

我有一个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);
    }
});
但是,根据目前的情况,这种方法已经被弃用


我知道我可以简单地命名函数,但是有没有其他方法可以让我继续使用未命名函数??

使用另一个匿名函数作为包装,将命名函数(被调用函数)存储到原始函数中:

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);
参考资料


使用以下过程:

  • 创建一个变量
  • 为变量指定一个匿名函数
  • 使用变量引用调用它
  • 匿名函数使用变量名引用自身
按如下方式使用:

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

这就是所有的人。

不。你必须以某种方式存储对它的引用,就像
参数一样。被调用方
这样做。你为什么坚持使用未命名函数?@user2736012问题更多的是出于好奇,而不是出于实际用途。不,除了对匿名函数使用变量引用之外,没有其他方法。如果有,它将是多余的。@user2736012得到它。谢谢。这与函数y(f){return function yf(){return f.bind(null,yf.apply)不同吗?是的,但OP问题的全部要点不是使用命名函数。很酷的东西,但它没有回答标题中的问题。公平地说,标题是错误的。:)但我实际上是在寻找
参数的通用替代方法。被调用方
,而这不是。Javascript是一种非常奇怪的语言,不是吗谢谢你的解决方案!我不知道这是可能的。