js this

.·2020년 9월 28일
0
post-custom-banner

1번, 2번 경우

global이나 function 실행시의 this는 window를 가리킨다.

var name = 'Global Variable';
console.log(this.name);

function foo() {
  console.log(this.name);
  }
foo();

둘의 this.name은 서로 같은 "Global Variable"

3번 경우

method 안의 this는 직계 부모 오브젝트를 가리킨다.

let obj = {
  hello: {
    fn: function() {console.log(this);}
  }
  foo: function() {console.log(this);}
}

obj.hello.fn() -> hello를 가져옴.
obj.foo(); -> obj를 가져욤.

다른 오브젝트에서 호출하였을 경우, 본인이 실행된 시점에서의 부모 오브젝트를 가져온다.

let obj 2 = {
  method: obj.foo
}

일 경우 obj2.method() === obj2

function 안의 this가 window를 가리키는 이유는 function의 부모가 window 때문이라 생각하면 된다.

4번 경우

new로 생성한 function 영역의 this(Construction mode)
다른 언어의 this와 비슷하다.

function Car(brand, name, color){
  this.brand = brand;
  this.name = name;
  this.color = color;
}

let avante = new Car('현대', '아반떼', '블랙');

예를 들어 위 코드에서의 this는 avante가 된다.

5번 경우
.call 혹은 .apply 호출.

foo() //function invocation
window.foo() //method invocation
new foo() //construction mode
foo.call()
foo.apply()

function bar(){
  console.log(this);
}
var obj = {hello: 'world'}
bar.call(obj);

위 코드에서 this는 obj가 된다.
this를 명시적으로 넘길 때 .call을 쓴다.
.call로 넘겨준 값이 this가 된다.

.apply는 매개변수가 여러개일 때 배열로 넘겨주고 call은 그냥 쉼표로 구분해서 넘겨준다.

let add = function(x,y){
  this.val = x + y;
}
let obj = {
  val: 0
};

add.apply(obj, [2, 8]);
console.log(obj.val); //10
add.call(obj, 2, 8);
console.log(obj.val); //10
post-custom-banner

0개의 댓글