这在事件侦听器上是未定义的

时间:2018-06-16 01:09:40

标签: javascript

我想知道为什么如果我在侦听器函数之外声明一个函数,this将是未定义的,但是如果我对delner函数内部的函数this进行定义将被定义..

工作:

someClass.each(function(i) {
  someClass.eq(i).on('click', (e) => {
    var targetClass = this.classList[0],
    console.log(targetClass);
  });
}); // this will be defined as the clicked class

不工作:

someClass.each(function(i) {
  someClass.eq(i).on('click', buttonClick)
}); 
buttonClick = (e) => {
    var targetClass = this.classList[0],
    console.log(targetClass);
}); // this will be undefined

2 个答案:

答案 0 :(得分:3)

  

对将使用object.method()语法调用的方法使用非箭头函数。这些函数将从调用者那里获得有意义的这个值。

箭头函数在词法上绑定它们的上下文,因此这实际上是指原始上下文。所以你不能在这些场景中使用箭头功能。

Source(特别是“这是什么?”部分)

More sources

答案 1 :(得分:0)

当你输入匿名关闭时,范围会发生变化,而在你的第二个功能中,范围会发生变化,这个'指向buttonClick函数外的Object。您可以执行以下操作以使代码正常工作

buttonClick = (e) => { // I'm assuming e = event object
    var targetClass = e.currentTarget.classList[0], 
    console.log(targetClass); 
});