어휘 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)”를 무시하도록하는 방법이 있습니까?
답변
이것은 Traceur와 관련이 없으며 무언가를 끄는 것과 관련이 없습니다. 이것은 단순히 ES6가 작동하는 방식입니다. =>
대신을 사용하여 요청하는 특정 기능 입니다 function () { }
.
ES6를 작성하려면 항상 ES6를 작성해야하고 특정 코드 줄에서 전환 할 수 없으며 =>
작동 방식을 억제하거나 변경할 수 없습니다 . 당신이 할 수 있다고하더라도, 당신은 단지 당신 만이 이해하고 사용자 정의 된 Traceur 외부에서는 제대로 작동하지 않는 기괴한 버전의 JavaScript를 보게 될 것입니다. 이것은 확실히 Traceur의 요점이 아닙니다.
이 특정 문제를 해결하는 방법 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
.
답변
이벤트 바인딩
$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();
})
이것은 첫 번째 인수로 요소 대신 index 를 넣는 jQuery의 역사적인 실수입니다 .
.each (함수)
function
유형 :Function( Integer index, Element element )
일치하는 각 요소에 대해 실행할 함수입니다.
답변
(이것은이 질문의 다른 버전에 대해 작성한 답변입니다.이 질문을 배우기 전에이 질문의 중복이었습니다. 대답이 정보를 상당히 명확하게 모아 놓은 것 같아서 크게 다르지만 커뮤니티 위키로 추가하기로 결정했습니다. 다른 답변의 구문.)
당신은 할 수 없습니다. 그것은 화살표 함수의 절반이며, this
호출 방법에 따라 설정된 자체를 갖는 대신 닫힙니다 . 질문의 사용 사례의 경우 this
핸들러를 호출 할 때 jQuery로 설정하려면 핸들러가 function
함수 여야 합니다.
그러나 화살표를 사용하는 이유가있는 경우 (아마도 this
화살표 외부에서 의미하는 것을 사용하려는 경우) 원하는 경우 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를가 설정 한 것과 동일한 this
핸들러를 호출 할 때.
답변
으로 빈약는 이 같은 질문에 그의 대답했다 당신이 ES6를 작성하려는 경우, 당신은 ES6 모든 시간을 쓸 필요 ,
따라서 ES6 :의 화살표 기능 (event)=>{}
을 사용 $(event.currentTarget)
하는 경우 대신 을 사용해야 합니다 $(this)
.
currentTarget을 더 멋지고 깔끔하게 사용할 수도 있습니다 ({currentTarget})=>{}
.
Class Game {
foo(){
this._pads.on('click', ({currentTarget}) => {
if(this.go) {
$(currentTarget).addClass('active');
}
});
}
}
원래이 아이디어는 @Meager 의 답변에서 rizzi frank 에 의해 주석 처리되었으며 유용하다고 느꼈고 모든 사람들이 그 주석을 읽지는 않을 것이라고 생각 하므로이 다른 대답으로 작성했습니다.