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,此方法已被弃用.
我知道我可以简单地命名这个函数,但有没有替代方法可以让我继续使用未命名的函数?
使用以下过程:
使用它如下:
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)
这就是所有人.
使用另一个匿名函数作为包装器将命名函数(被调用者填充程序)存储到原始函数中:
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)
参考