JavaScript에서 함수의 this
는 다른 언어와 조금 다르게 동작합니다. 또한 엄격 모드와 비엄격 모드에서도 일부 차이가 있습니다.
대부분의 경우 this의 값은 함수를 호출한 방법에 의해 결정됩니다. 실행중에는 할당으로 설정할 수 없고 함수를 호출할 때 마다 다를 수 있습니다. ES5는 함수를 어떻게 호출했는지 상관하지 않고 this 값을 설정할 수 있는 bind 메서드를 도입했고, ES2015는 스스로의 this 바인딩을 제공하지 않는 화살표 함수를 추가했습니다(이는 렉시컬 컨텍스트안의 this값을 유지합니다).
기본적 바인딩 : 일반 함수 호출에서 this는 전역 객체를 가리킨다.
암시적 바인딩
명시적 바인딩
new 바인딩
엄격모드 : 런타임시 js 코드에 대하여 엄격한 pasing 및 error handling을 자발적으로 실행하도록 적용함으로써 일반적인 코딩실수나 안전하지 않는 동작을 포착합니다.
var obj1 = {
name: 'LEE',
sayName: function () {
console.log(this.name)
}
}
var obj2 = {
name: 'KIM'
}
obj2.sayName = obj1.sayName;
obj1.sayName() //LEE
obj2.sayName() //KIM
function test(){
console.log(this)
}
var obj = {name : 'hahaha'}
test.call(obj); //{name: 'hahaha'}
객체의 메소드에서 this를 사용하여 해당 객체의속성에 접근하거나 수정할 수 있습니다.
또한 call(),apply 메소드를 사용하여 함수 내에서 this를 지정하여 특정 객체의 속성에 접근하거나 수정 할 수 있습니다.
this를 사용하는 가장 큰 차이점은 함수를 호출하는 방법에 따라 this가 참조하는 값이 달라진다는 것 입니다.
그리고 이러한 동적인 특성 때문에 this의 값이 예상과 다르게 결정될 수 있습니다. 따라서 this를 사용할 때는 주의가 필요합니다.
특히 콜백 함수나 중첩 함수에서 this를 사용할때 주의가 필요합니다. this를 변수에 저장하여 사용하거나 bind()메소드를 사용해서 this를 지정할 수 있습니다.