使用带有词法this
绑定的ES6箭头函数是很棒的。
然而,我在使用它和典型的jQuery点击绑定时遇到了一个问题:
class Game {
foo() {
self = this;
this._pads.on('click', function() {
if (self.go) { $(this).addClass('active'); }
});
}
}
改用箭头函数:
class Game {
foo() {
this._pads.on('click', () => {
if (this.go) { $(this).addClass('active'); }
});
}
}
然后$(this)
被转换为ES5 (self = this)类型的闭包。
有没有办法让Traceur忽略词法绑定的"$(this)“?
发布于 2014-12-28 02:52:24
这与Traceur和关闭某些东西无关,这就是ES6的工作原理。这是您通过使用=>
而不是function () { }
所要求的特定功能。
如果你想要写ES6,你需要一直写ES6,你不能在某些代码行上来回切换,你也绝对不能抑制或改变=>
的工作方式。即使可以,你也只能得到一些只有你自己才能理解的奇怪的JavaScript版本,如果没有你的定制跟踪,它永远不会正常工作,这绝对不是跟踪的意义所在。
解决这个特殊问题的方法不是使用this
来访问被单击的元素,而是使用event.currentTarget
Class Game {
foo(){
this._pads.on('click', (event) => {
if(this.go) {
$(event.currentTarget).addClass('active');
}
});
}
}
jQuery特别提供了event.currentTarget
,因为即使在ES6之前,jQuery并不总是可以在回调函数上施加this
(即,如果它通过bind
绑定到另一个上下文。
发布于 2015-12-10 18:27:41
事件绑定
$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
});
发布于 2017-03-27 21:54:55
另一个案例
meagar的答案是正确的,我对它投了赞成票。
然而,还有另一种情况:
$('jquery-selector').each(() => {
$(this).click();
})
可以修复为:
$('jquery-selector').each((index, element) => {
$(element).click();
})
这是jQuery中的一个历史错误,它将索引,而不是元素作为第一个参数:
.each(函数)
函数
类型:Function( Integer index, Element element )
对每个匹配的元素执行的函数。
https://stackoverflow.com/questions/27670401
复制相似问题