해당 내용은 '코어 자바스크립트' 서적을 참고하여 작성되었으며, 초보 개발자에게 유익한 책을 지필해주신 지은이 정재남 님께 감사의 말씀을 드립니다.
this
는 기본적으로 실행컨텍스트가 구성될 때 thisBinding
정보로 저장된다.this
가 만들어진다는 의미이다.this
개념은 함수가 실행되는 위치 뿐만 아니라 호출 방식에 따라서도 그 값이 다르다.window
/ node.js 에서는 global
라고 나타낸다.// 브라우저 환경
console.log(this === window); // true
// node.js 환경
console.log(this === global); // true
this
안의 프로퍼티로 할당된다.var a = 1;
console.log(this.a); // 1
console.log(window.a); // 1
// 그리고 전역 객체에 직접 할당해줄 수도 있다
this.b = 2;
console.log(b); // 2
var a = 1;
this.b = 2;
delete a; // false
delete b; // true
// 변수 선언 방식은 삭제되지 않는 반면, 객체 할당 방식은 삭제된다.
/* 좀더 정확하게 말하자면, 전자의 방식은 configurable 속성으로 false 값을 할당하고
후자의 방식은 configurable 속성으로 true 값을 할당한다 */
// var로 선언한 전역변수와 전역객체의 프로퍼티는 호이스팅 여부 및 configurable(변경 및 삭제 가능성) 여부에서 차이를 보인다.
let func = function () {
console.log(this);
};
var obj = {
method: func,
};
// 함수로서 호출 형태
func(); // window (전역 객체)
// 메서드로서 호출 형태
obj.method(); // {method : f} (obj 객체 변수)
/* 두 호출 모두 똑같이 func 함수를 가리키지만
호출하는 방식에 따라 console.log(this) 값이 다르다*/
this
정보로 전역객체를 수집한다. 하지만 메서드 방식 은 객체의 프로퍼티로서 호출하기 때문에 자신을 호출한 객체의 정보를 this
정보로 수집한다.this
(호출하는 주체) 정보는 해당 함수명(프로퍼티명) 앞의 객체이다(obj.property
or obj['property']
)
this
를 우회하거나 설정하지 않는 방법
이런식으로 호출 방식에 따라this
정보가 바뀜으로서 함수로서의 호출 방식의this
값에 전역객체가 담긴다. 이 때문에 만약 해당 함수가 지역변수로 쓰일시this
사용시 혼란을 줄 수 있다. 그래서this
정보를 우회해서 담거나 설정하지 않는 방법이 있다.
1.this
정보 우회
this
를 사용하는 함수의 상위 환경에서 미리this
를 특정 변수에 할당하면, 그 변수를 해당 함수의 내부 범위에서 활용할 수 있다.
2.this
정보를 바인딩하지 않는 함수:arrow function
arrow function
은this
정보 생성하지 않는다. 그래서this
값을 접근할 때에 상위 스코프의this
정보를 가져온다.
this
정보를 지정할 수 있다.setTimeout(function () {
console.log(this); // 전역객체
}, 300);
[1, 2, 3].forEach(function () {
console.log(this); // 전역객체
});
// 위의 두 함수는 콜백함수의 this 값을 따로 지정해주지 않는다.
document.body.innerHTML += '<button id="a">click</button>';
document.body.querySelector('#a').addEventListener('click', function (e) {
console.log(this); // <button>
});
// addEventListner 함수는 콜백함수의 this 값에 자신의 this 값을 상속해준다.
this
가 정의된다.// 생성자 함수
var Constructor = function (name, age) {
this.id = name;
this.pw = age;
};
// 인스턴스 만들기
var instance_1 = new Constructor('son', 28);
var instance_2 = new Constructor('yun', 25);
// 결과 확인(this)
console.log(instance_1); // Constructor { id: 'son', pw: 28 }
console.log(instance_2); // Constructor { id: 'yun', pw: 25 }
// 결과를 보면 this 값이 인스턴스 자신을 지칭한다는 것을 알 수 있다