전역공간에서 this를 사용하면 전역객체를 가르킨다.
ex) web = window, node.js = global
console.log(this === window); // true
a = 37;
console.log(window.a); // 37
window 와 global 은 ECMAScript 에서 정의 한 객체가 아니라 ECMAScript가 전역 객체는 이러이러해야 한다
라고 정의 해둔 내용에 따라서 런타임 에사 제공하는 구현체 이다.
메소드로 호출 했을 때의 this는 메소드를 호출한 주체, 메소드를 누가 호출 했는냐, 메소드 명의 '점' 바로 앞에 있는 애가 this 가 된다.
const a = {
b: function () {
console.log(this); // {b: ƒ}
},
};
a.b();
/*
b라고 하는 함수는 a의 프로퍼티이다 즉 프로퍼티에 함수를 할당한 것이다.
그런데 그 함수를, b함수를 a 객체의 메소드로써 호출했다 라는 말이된다.
그러니까 앞에 점이있으면 (=== a.b) 그 앞에 객체의 메서드로써 이 b를 호출했다 라는 말이 된다.
클래스와 상관없이 객체와 관련된 동작만 하면 메소드 라는 것이다.
b는 원래 함수인데 어떤 객체와 관련된 동작을 하면 그때는 메소드로 부르겠다 라는 말이다.
이때 '어떤객체'가 바로 점 앞에 있는 것이다. (=== a)
*/
const i = {
j: 10,
k: function () {
console.log(this.j); // 10
const l = () => {
console.log(this.j); // 10
};
l();
},
};
i.k();
// this를 바인딩 하지 않으므로 상위에 있는 this를 그대로 사용한다.
// 그래서 위 값과 똑같은 결과 값을 가르킨다.
function a() {
console.log(this); // window
}
a();
function b() {
function c() {
console.log(this); // window
}
c();
}
b();
const d = () => {
const f = () => {
console.log(this); // d
};
f();
};
d();
const g = {
h: function () {
function i() {
console.log(this); // window
}
i();
},
};
g.h();
const callback = function () {
console.log(this); // window
};
const obj = {
a: 1,
b: function (callback) {
callback();
},
};
obj.b(callback);
const callback1 = function () {
console.log(this); // {a1: 1, b1: ƒ}
};
const obj1 = {
a1: 1,
b1: function (callback1) {
const c1 = callback1.bind(this);
c1();
},
};
obj1.b1(callback1);
const callback2 = function () {
console.log(this);
};
const obj2 = {
a2: 1,
};
setTimeout(callback2.bind(obj2), 1000); //{ a2: 1 }
function PeoPle(name, age) {
this.name = name;
this.age = age;
}
const a = PeoPle('SC', 23);
console.log(window.name, window.age); // SC, 23
일반적으로 new 연산자 없이 그냥 people 함수를 호출할 경우에는 a에는 아무것도 담기지 않게 되고 함수로써 호출한 것이기 때문에 window.name을 해주면 값을 얻을 수 있다.
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const b = new Person('RM', 24);
const c = new Person('V', 25);
console.log(b); // Person { name: 'RM', age: 24 }
console.log(c); //Person { name: 'V', age: 25 }
생성자 함수로써 호출 한 것이니 b와c에 즉 새로 생설될 person의 인스턴스 객체 자신이 곧 this가 된다. 그리고 객체가 새로 생성 되면서 name프로퍼티, age프로퍼티가 각각 생성된다.