使用jQuery $(this)和ES6箭头函数(lexical this binding)
使用ES6的箭头函数与词法this
绑定是伟大的。
不过,我刚才遇到一个问题,使用它与一个典型的jQuery点击绑定:
class Game { foo() { self = this; this._pads.on('click', function() { if (self.go) { $(this).addClass('active'); } }); } }
改为使用箭头function:
class Game { foo() { this._pads.on('click', () => { if (this.go) { $(this).addClass('active'); } }); } }
然后$(this)
被转换成ES5(self = this)types的闭包。
是否让Traceur忽略“$(this)”来进行词法绑定?
这跟Traceur没什么关系,只是ES6的工作原理。 这是您要求的特定function,而不是使用function () { }
。
如果你想编写ES6,你需要一直编写ES6,你不能在特定的代码行上进出它,而且你肯定无法抑制或者改变方式=>
工作。 即使你可以的话,你也只能得到一些离奇的版本的JavaScript,只有你自己明白,而且在你定制的Traceur之外是不会正常工作的,这当然不是Traceur的要点。
解决这个问题的方法不是使用this
来访问clicked元素,而是使用event.currentTarget
:
Class Game { foo(){ this._pads.on('click', (event) => { if(this.go) { $(event.currentTarget).addClass('active'); } }); } }
jQuery提供了event.currentTarget
因为即使在ES6之前,jQuery并不总是可能在callback函数中施加this
(即,如果它通过bind
绑定到另一个上下文。
事件绑定
$button.on('click', (e) => { var $this = $(e.currentTarget); // ... deal with $this });
循环
Array.prototype.forEach.call($items, (el, index, obj) => { var $this = $(el); // ... deal with $this });
另一种情况
最好的答案是正确的,我已经投了票。
不过,还有另一种情况:
$('jquery-selector').each(() => { $(this).click(); })
可以修复为:
$('jquery-selector').each((index, element) => { $(element).click(); })
(这是我为这个问题的另一个版本写的一个答案,在得知这个问题是一个重复的问题之前,我认为这个答案能够很清楚地把信息汇总在一起,所以我决定把它作为一个社区维基添加进来,其他答案的措辞。)
你不能。 这是箭头function的一半,他们closures了this
function,而不是由他们如何调用自己的设置。 对于问题中的用例,如果你想在调用处理程序时通过jQuery设置,处理程序将需要是一个function
function。
但是,如果你有一个使用箭头的理由(也许你想用它来表示箭头之外的含义),如果你喜欢,你可以使用e.currentTarget
代替this
:
class Game { foo(){ this._pads.on('click', e => { // Note the `e` argument if(this.go) { $(e.currentTarget).addClass('active'); // Using it } }); } }
事件对象的currentTarget
与jQuery在调用处理程序时设置的相同。