- 자바스크립트에는 this라는 키워드가 있다. this는 문맥에 따라서 다양한 값을 가지는 데, this가 쓰이는 함수를 어떤 방식으로 실행하느냐에 따라서 그 역할이 구별된다.
- this의 값들은 크게 4가지 정도로 나눌 수 있다. 즉, this를 이용하는 함수를 4가지 방식 중에서 어떤 방식으로 실행하느냐에 따라 this의 값이 결정된다는 뜻이다.
- 이러한 특성 때문에 this가 무엇을 지칭하는지 알기 위해서 우리는 this가 사용된 함수가 어디서 어떻게 실행되었는지를 찾아야만 한다.
첫 번째로, 일반 함수 실행 방식으로 함수를 실행했을 때 this의 값은 Global Object를 가리킨다. 즉 브라우저 상에서는 window객체를 말한다.
window란 전역 객체를 뜻하며 전역변수를 선언하면 window내에 들어가게 됨
var age = 100;
function foo () {
var age = 99;
bar(age)
}
function bar () {
console.log(this.age);
}
foo();
>> 여기서 this는 전역객체를 뜻하기 때문에 100이 출력된다
Strict mode란 단어 그대로 엄격한 형식이라는 뜻이다. 즉, Strict mode에서 실행되는 모든 코드들에 좀 더 엄격한 규칙들을 적용하는 것을 말한다.
이러한 엄격한 방식을 적용하는 이유에는 여러 가지가 있겠지만 가장 크게는 비엄격 모드(Sloppy mode)에서 자주 일어나는 다양한 실수들을 방지하여 각종 에러들을 감소시키는 데 있다.
strict mode를 사용하려면 스크립트 코드 맨 상단에 'use strict'; 혹은 "use strict";라는 구문을 추가하면 된다.
var name = 'Julia';
function foo () {
console.log(this.name); // error
}
foo();
Dot Notation이란 우리가 Object를 만들고 그 Object의 key와 value를 부여한 후 도트(.)로 값에 접근하는 방식을 말한다. 아래 예제를 보면 이해가 쉽다.
var age = 100;
var ken = {
age: 35,
foo: function () {
console.log(this.age); // 35
}
}
ken.foo();
var age = 100;
function foo() {
console.log(this.age);
}
var ken = {
age: 35,
log: foo
}
foo.call(ken, 1, 2, 3);
위 코드에서 우리는 foo 함수에 call 메소드를 사용하여 실행하였는 데, 인자로 각각 ken, 1, 2, 3을 주었다. 이 인자들 중에서 가장 첫 번째로 쓴 ken이 바로 this의 값으로 지정된다. 1, 2, 3은 this의 값과는 상관없이 순서대로 foo 함수가 된다.
그러므로 위 코드에서 this.age는 ken.age가 되어 35가 출력된다.
var age = 100;
function foo() {
console.log(this.age);
}
var ken = {
age: 35,
log: foo
}
foo.apply(ken, [1, 2, 3, 4, 5]);
함수를 그냥 foo()와 같은 형태로 실행할 수도 있지만 new 키워드를 사용해서 생성자 함수로 만들어 사용할 수도 있다. 이 경우에 this는 빈 객체가 된다.
function Person () {
console.log(this);
}
new Person();
>> Person {}