ES6 화살표 함수와 함께 jQuery $ (this) 사용 (이 바인딩 어휘)


129

어휘 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)"를 무시하도록하는 방법이 있습니까?


이것은 .on()실제로 this유용한 값을 가지고 있기 때문에 화살표 기능을 사용하지 않는 경우의 완벽한 예처럼 보입니다 . 나에게는 this이벤트를 전달하고 수동으로 대상을 찾는 것보다 이벤트 대상 을 참조하는 것이 훨씬 더 명확 합니다. 화살표 기능을 많이 사용하지는 않았지만 익명의 기능으로 앞뒤로 이동하는 것이 혼란 스러울 것 같습니다.
robisrob

답변:


194

이것은 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.


4
위임 된 .on통화에 대해서만 달라 지지만 this실제로는 event.currentTarget입니다.
loganfsmyth

이 대답은 괜찮습니까? loganfsmyth가 언급 한 것처럼 this== event.currentTarget. 아니?
Léon Pelletier

3
LéonPelletier 호 @ thisevent.currentTarget않는 동일한 thisES6처럼 둘러싸는 영역에 결합 된 기능 화살표.
meagar

8
일부 코드를 저장하려면 구조를 해제 할 수도 있습니다. ({currentTarget}) => {$ (currentTarget) .addClass ( 'active')}
Frank

55

이벤트 바인딩

$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
});

찾고 $jQueryElements.each()계십니까? jQuery는 실제로 각 개체에 몇 가지 인수를 전송하므로 전혀 필요하지 않습니다 => 그것은$(...).each((index, el) => console.log(el))
jave.web

53

다른 경우

정답이 정답이며 찬성했습니다.

그러나 다른 경우가 있습니다.

$('jquery-selector').each(() => {
    $(this).click();
})

다음과 같이 수정할 수 있습니다.

$('jquery-selector').each((index, element) => {
    $(element).click();
})

이것은 첫 번째 인수로 요소 대신 index 를 넣는 jQuery의 역사적인 실수입니다 .

.each (함수)

function
유형 : Function( Integer index, Element element )
일치하는 각 요소에 대해 실행할 함수입니다.

참조 : https://api.jquery.com/each/#each-function


1
같은 fucntions에 대한 동일$('jquery-selector').map
니콜라스 Siegmundt

이것은 $ ( 'jquery-selector'). filter 등과 같은 것들에서 사용하기에 매우 유용했습니다.
R Jones

8

(이것은이 질문의 다른 버전에 대해 작성한 답변입니다.이 질문을 배우기 전에이 질문의 중복이었습니다. 대답이 정보를 상당히 명확하게 모아 놓은 것 같아서 크게 다르지만 커뮤니티 위키로 추가하기로 결정했습니다. 다른 답변의 구문.)

당신은 할 수 없습니다. 그것은 화살표 함수의 절반이며, 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핸들러를 호출 할 때.


5

으로 빈약는 이 같은 질문에 그의 대답했다 당신이 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 에 의해 주석 처리되었으며 유용하다고 느꼈고 모든 사람들이 그 주석을 읽지는 않을 것이라고 생각 하므로이 다른 대답으로 작성했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.