Javascript 参数的替代方法。被调用方
我有一个EventListener,它侦听整个文档并记录击键,但我希望在满足某些条件时删除此侦听器 以下是我的代码片段: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
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是一种非常奇怪的语言,不是吗谢谢你的解决方案!我不知道这是可能的。