this - hochan222/Everything-in-JavaScript GitHub Wiki
- JavaScript์์ ํจ์์ this ํค์๋๋ ๋ค๋ฅธ ์ธ์ด์ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ๋์ํ๋ค. ๋ํ ์๊ฒฉ ๋ชจ๋์ ๋น์๊ฒฉ ๋ชจ๋์์๋ ์ผ๋ถ ์ฐจ์ด๊ฐ ์๋ค.
- ์คํ ์ปจํ ์คํธ(global, function ๋๋ eval)์ ํ๋กํผํฐ๋ ๋น์๊ฒฉ ๋ชจ๋์์ ํญ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉฐ, ์๊ฒฉ ๋ชจ๋์์๋ ์ด๋ ํ ๊ฐ์ด๋ ๋ ์ ์๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ this์ ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ ๋ฐฉ๋ฒ์ ์ํด ๊ฒฐ์ ๋๋ค. ์คํ์ค์๋ ํ ๋น์ผ๋ก ์ค์ ํ ์ ์๊ณ ํจ์๋ฅผ ํธ์ถํ ๋ ๋ง๋ค ๋ค๋ฅผ ์ ์๋ค.
ES5๋ ํจ์๋ฅผ ์ด๋ป๊ฒ ํธ์ถํ๋์ง ์๊ดํ์ง ์๊ณ this ๊ฐ์ ์ค์ ํ ์ ์๋ bind ๋ฉ์๋๋ฅผ ๋์ ํ๋ค.
ES2015๋ ์ค์ค๋ก์ this ๋ฐ์ธ๋ฉ์ ์ ๊ณตํ์ง ์๋ ํ์ดํ ํจ์๋ฅผ ์ถ๊ฐํ๋ค(์ด๋ ๋ ์์ปฌ ์ปจํ ์คํธ์์ this๊ฐ์ ์ ์งํ๋ค).
๋๋ผ์ด ์ฌ์ค์ MDN์ ์์ ์ 42๊ฐ ์๋ค!!?! ์๋ํ๋ค 42...
const test = {
prop: 42,
func: function() {
return this.prop;
},
};
console.log(test.func());
// expected output: 42
Global Context
- ์ ์ญ ์คํ ๋ฌธ๋งฅglobal execution context์์ this๋ ์๊ฒฉ ๋ชจ๋ ์ฌ๋ถ์ ๊ด๊ณ ์์ด ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
// ์น ๋ธ๋ผ์ฐ์ ์์๋ window ๊ฐ์ฒด๊ฐ ์ ์ญ ๊ฐ์ฒด
console.log(this === window); // true
a = 37;
console.log(window.a); // 37
this.b = "MDN";
console.log(window.b) // "MDN"
console.log(b) // "MDN"
NOTE: globalThis๋ก ์ฐ๋ฆฌ๋ ํญ์ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์๋ค. globalThis ์์ฑ์ ํ๊ฒฝ์ ๋ฌด๊ดํ๊ฒ ์ ์ญ this ๊ฐ, ์ฆ ์ ์ญ ๊ฐ์ฒด์ ์ ๊ทผํ๋ ํ์ค ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
Function Context
- ํจ์ ๋ด๋ถ์์ this์ ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ ๋ฐฉ๋ฒ์ ์ํด ์ข์ฐ๋ฉ๋๋ค.
๋ค์ ์์ ๋ ์๊ฒฉ ๋ชจ๋๊ฐ ์๋๋ฉฐ this์ ๊ฐ์ด ํธ์ถ์ ์ํด ์ค์ ๋์ง ์์ผ๋ฏ๋ก, ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์๋ window์ธ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
function f1() {
return this;
}
// ๋ธ๋ผ์ฐ์
f1() === window; // true
// Node.js
f1() === global; // true
๋ฐ๋ฉด์ ์๊ฒฉ ๋ชจ๋์์ this ๊ฐ์ ์คํ ๋ฌธ๋งฅ์ ์ง์ ํ๋ฉฐ ์ค์ ๋๋ ๊ฐ์ ์ ์งํ๋ฏ๋ก ๋ค์ ์์์์ ๋ณด์ฌ์ง๋ ๊ฒ ์ฒ๋ผ this๋ undefined๋ก ๋จ์์๋ค.
function f2(){
"use strict"; // ์๊ฒฉ ๋ชจ๋ ์ฐธ๊ณ
return this;
}
f2() === undefined; // true
๋น์๊ฒฉ ๋ชจ๋์์ this๋ก ์ ๋ฌ๋ ๊ฐ์ด ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ, call๊ณผ apply๋ ์ด๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ ์ํ ์๋๋ฅผ ํ๋ค.
Object Method
- ํจ์๋ฅผ ์ด๋ค ๊ฐ์ฒด์ ๋ฉ์๋๋ก ํธ์ถํ๋ฉด this์ ๊ฐ์ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
var o = {
prop: 37,
f: function() {
return this.prop;
}
};
console.log(o.f()); // 37