You can't.
The value of this in an arrow function is inherited from the enclosing (lexical) scope. Functions have a special variable this that refers to the object via which the method was invoked. As the value of this is dynamically given based on the function invocation, it is sometimes called dynamic this .
jQuery source is now authored using ES6 modules. It's possible to use them directly in the browser without any build process.
Introduction. The 2015 edition of the ECMAScript specification (ES6) added arrow function expressions to the JavaScript language. Arrow functions are a new way to write anonymous function expressions, and are similar to lambda functions in some other programming languages, such as Python.
This has nothing to do with Traceur and turning something off, this is simply how ES6 works. It's the specific functionality you're asking for by using =>
instead of function () { }
.
If you want to write ES6, you need to write ES6 all the time, you can't switch in and out of it on certain lines of code, and you definitely cannot suppress or alter the way =>
works. Even if you could, you would just wind up with some bizarre version of JavaScript that only you understand and which would never work correctly outside of your customized Traceur, which definitely isn't the point of Traceur.
The way to solve this particular problem is not to use this
to gain access to the clicked element, but instead use event.currentTarget
:
Class Game {
foo(){
this._pads.on('click', (event) => {
if(this.go) {
$(event.currentTarget).addClass('active');
}
});
}
}
jQuery provides event.currentTarget
specifically because, even before ES6, it is not always possible for jQuery to impose a this
on the callback function (ie, if it was bound to another context via bind
.
Event binding
$button.on('click', (e) => {
var $this = $(e.currentTarget);
// ... deal with $this
});
Loop
Array.prototype.forEach.call($items, (el, index, obj) => {
var $this = $(el);
// ... deal with $this
});
The answer by meagar is correct and I've up-voted it.
However, there is another case:
$('jquery-selector').each(() => {
$(this).click();
})
Could be fixed as:
$('jquery-selector').each((index, element) => {
$(element).click();
})
This is a historical mistake in jQuery which puts the index, instead of the element as the first argument:
.each( function )
function
Type:Function( Integer index, Element element )
A function to execute for each matched element.
See: https://api.jquery.com/each/#each-function
(This is an answer I wrote for another version of this question, before learning it was a duplicate of this question. I think the answer pulls together the information fairly clearly so I decided to add it as a community wiki, although it's largely just different phrasing of the other answers.)
You can't. That's half the point of arrow functions, they close over this
instead of having their own that's set by how they're called. For the use case in the question, if you want this
set by jQuery when calling the handler, the handler would need to be a function
function.
But if you have a reason for using an arrow (perhaps you want to use this
for what it means outside the arrow), you can use e.currentTarget
instead of this
if you like:
class Game {
foo(){
this._pads.on('click', e => { // Note the `e` argument
if(this.go) {
$(e.currentTarget).addClass('active'); // Using it
}
});
}
}
The currentTarget
on the event object is the same as what jQuery sets this
to when calling your handler.
As Meager said in his answer on this same question If you want to write ES6, you need to write ES6 all the time,
so if you are using arrow function of ES6: (event)=>{}
, then you have to use $(event.currentTarget)
instead of $(this)
.
you can also use more nicer and cleaner way of using currentTarget as ({currentTarget})=>{}
,
Class Game {
foo(){
this._pads.on('click', ({currentTarget}) => {
if(this.go) {
$(currentTarget).addClass('active');
}
});
}
}
originally this idea was commented by rizzi frank in meagar's answer, and i felt it useful and i think that not all people will read that comment so i have written it as this another answer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With