Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.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_Reactjs - Fatal编程技术网

Javascript 删除事件侦听器可以';看不到类函数

Javascript 删除事件侦听器可以';看不到类函数,javascript,reactjs,Javascript,Reactjs,我有一个事件监听器来监听Escape press,此时我的模式将关闭;但是由于某种原因,我收到一个错误,无法进行关闭函数调用 Uncaught TypeError: this.closeModalFunc is not a function at checkEscape 我的班级: checkEscape(pressed) { if (pressed.key === 'Escape') { this.closeModal(); } } componentWil

我有一个事件监听器来监听Escape press,此时我的模式将关闭;但是由于某种原因,我收到一个错误,无法进行关闭函数调用

Uncaught TypeError: this.closeModalFunc is not a function at checkEscape
我的班级:

checkEscape(pressed) {
    if (pressed.key === 'Escape') {
        this.closeModal();
    }
}

componentWillMount() {
    window.addEventListener('keydown', this.checkEscape);
}

componentWillUnmount() {
    window.removeEventListener('keydown', this.checkEscape);
}

closeModal () {
    // code to close modal
}
然而,我发现如果我将
checkEscape
更改为一个函数常量,这个问题就会消失,一切都会按预期进行

checkEscape = pressed => { /** the same innards */ };

当然,我很高兴我能做到这一点,但是我想了解为什么会发生这种情况…

类组件要求您在构造函数中进行超级有趣的绑定,例如

this.checkEscape=this.checkEscape.bind(this)

箭头函数自动绑定到类


如果这还不能让你想使用带有钩子的功能组件,我不知道会是什么D

导致问题。由于
内部箭头函数与封闭范围内的函数相同,因此在您的情况下,封闭范围是组件的范围,因此问题消失了。您可以使用箭头函数或使用
.bind()
checkEscape
中绑定
的值,我对
.bind()
不是很熟悉。“你能告诉我我该去哪里吗?”physicsboy看起来你的问题已经得到了回答。啊,这为我澄清了问题,谢谢。我想,考虑到现在我可以看到它是如何双向工作的。。。我将沿着箭头方向走,因为它的代码更少,而且我不必引入新的构造函数(Y)@physicsboy
。bind()
不是构造函数。您可以在MDN上查找详细信息。