Javascript 函数的作用域问题和转换为箭头函数

Javascript 函数的作用域问题和转换为箭头函数,javascript,arrow-functions,Javascript,Arrow Functions,我正在学习如何使用箭头函数,并尝试转换下面的代码。funcCall和enterKey存在作用域问题。我相信箭头函数可以解决这个问题 function pressKey(funcCall, enterKey = 13) { document.addEventListener("keydown", _onKeyDown); } function _onKeyDown(e) { if(e.keyCode === enterKey) { e.preventDefault(

我正在学习如何使用箭头函数,并尝试转换下面的代码。funcCall和enterKey存在作用域问题。我相信箭头函数可以解决这个问题

function pressKey(funcCall, enterKey = 13) {
    document.addEventListener("keydown", _onKeyDown);
}
function _onKeyDown(e) {
    if(e.keyCode === enterKey) {
        e.preventDefault();
        funcCall();
    }
}

您需要的是部分应用程序的闭包,是的,箭头函数有助于简洁地实现这一点:

const _onKeyDown = (funcCall, enterKey) => e => {
    if (e.keyCode === enterKey) {
        e.preventDefault();
        funcCall();
    }
};

function pressKey(funcCall, enterKey = 13) {
    document.addEventListener("keydown", _onKeyDown(funcCall, enterKey));
}
但是,正如其他人所指出的,此功能并不是箭头函数所独有的,因此,如果您喜欢键入或没有ECMAScript 2015语法,请:

function _onKeyDown(funcCall, enterKey) {
    return function (e) {
        if (e.keyCode === enterKey) {
            e.preventDefault();
            funcCall();
        }
    };
}

function pressKey(funcCall, enterKey = 13) {
    document.addEventListener("keydown", _onKeyDown(funcCall, enterKey));
}

您需要在
按键
的范围内创建
\onKeyDown
,这样它就可以通过闭包访问
funcall
enterKey

function pressKey(funcCall, enterKey = 13) {
    function _onKeyDown(e) {
        if(e.keyCode === enterKey) {
            e.preventDefault();
            funcCall();
        }
    }
    document.addEventListener("keydown", _onKeyDown);
}

使用或不使用箭头函数并不重要。

请告诉我们您是如何尝试更改为代码的,否则我们无法告诉您出了什么问题。不要忘记调用
按键
函数,否则事件侦听器将无法初始化。@cmac与此无关,除了提供将代码减少几个字符的机会之外,箭头函数也没有任何特殊的“帮助”功能。:-)诚然,这可能是对提问者想要的更好的解释,尽管这种方法并不总是可行的,例如,如果您希望
onKeyDown
pressKey
在单独的文件中。如果这是一个完整的示例,我会将其作为可运行的代码段插入。询问者没有提供完整的示例。我错过了第二个
=>
。正因为这个原因,我真的不喜欢这种风格的代码,Bergi的例子更具可读性。同意不同意!这种样式提供了模块化的好处,而Bergi的回答要求
onKeyDown
存在于
pressKey
的范围内。我的评论是关于样式,而不是功能或设计。@RobG这样更好吗?