자바 스크립트 클래스 구문 및이를 메서드에 바인딩 [중복]
Dec 09 2020
아래 구문이 작동하는 방식의 기본적인 차이점을 이해하고 싶었습니다.
// Syntax 1
class Component extends React.Component {
constructor(props) {
super(props)
this.handleClick = this.handleClick.bind(this)
}
handleClick() {
// ...
}
}
// Syntax 2
handleClick = () => {
console.log('this is:', this)
}
<button onClick={this.handleClick}>
{'Click me'}
</button>
구문 1은 생성자 내부에 명시 적 바인딩을 지정해야합니다. 그러나 구문 2에서는 필요하지 않은 것처럼 보입니다. 구문 2는 어떻게 자동으로 바인딩을 수행 할 수 있습니까?
이 이해 / 구문은 React, Angular, Ember 등을 포함한 모든 프레임 워크에 대해 확장 될 수 있다고 가정합니다.
답변
1 CertainPerformance Dec 09 2020 at 11:52
클래스 필드 (즉, 클래스 본문 내부에 직접 정의 된 속성)는 기본적으로 생성자 내부의 동일한 항목에 대한 구문 설탕 일뿐입니다. 그래서 이건:
class Something {
handleClick = () => {
console.log('this is:', this)
}
}
is, desugared :
class Something {
constructor() {
this.handleClick = () => {
console.log('this is:', this)
};
}
}
슈가 링이 제거되면 무슨 일이 일어나고 있는지 명확해야합니다. 화살표 함수 는 인스턴스 자체 인 생성자에있는 this
것을 참조하며 this
바인딩이 필요하지 않음을 의미합니다.
이것은 단순한 React 또는 프레임 워크가 아니라 바닐라 JavaScript의 표준 규칙입니다.
메서드를 바인딩하지 않거나 화살표 함수 또는 이와 유사한 것을 사용하지 않는 경우 :
<button onClick={this.handleClick}>
같은 이유로 실패
someButton.addEventListener('click', myObj.someFn)
또한 다음 someFn
과 같은 호출 컨텍스트 로 호출에 실패 myObj
합니다. 브라우저가 알고있는 모든 것은 클릭 리스너에 전달 된 콜백을 호출하는 것입니다. 이렇게 myObj
전달되면 의 호출 컨텍스트 가 손실됩니다.