๐ "this๋ JavaScript์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ค๋ช ํด์ฃผ์ธ์."
this
๊ฐC++, JAVA์ ๊ฐ์ ์ธ์ด์์ this
๋ ์๊ธฐ์์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๊ทธ๋ฌ๋ JavaScript ์ this
๊ฐ์ ์คํ ์ปจํ
์คํธ์ thisValue
์ ์ํด ๊ฐ์ด ๋ฐ์ธ๋ฉ ๋๋ค.
thisValue
๋ ์๋์ 5๊ฐ์ง ํจํด์ ์ํด ๊ฒฐ์ ๋๋ค.
call()
, apply()
, bind()
๐ก ๋ฐ์ธ๋ฉ : ์ค์ ๊ฐ์ด ๋ณ์์ ๋ฌถ์ด๋ ๊ฒ
๐ก strict ๋ชจ๋ : ES5 ์ ์๋ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ์๊ฒฉํ๊ฒ ๋ฌธ๋ฒ์ ๊ฒ์ฌํ๋ ๋ชจ๋์ด๋ค.
์ ์ญ์์ this
๋ ์ ์ญ ์ปจํ
์คํธ์ ์ํฅ์ ๋ฐ์ this
๊ฐ์ ์ ์ญ ๊ฐ์ฒด ๊ฐ ๋๋ค.
// ๋ธ๋ผ์ฐ์ ์์๋ window ๊ฐ ์ ์ญ๊ฐ์ฒด ์ด๋ค.
console.log(this === window); // true
this.myString = "hello?";
console.log(window.myString); // "hello?"
console.log(myString); // ์ ์ญ ๋ณ์ myString์ ์ถ๋ ฅ: "hello?"
๐ก NodeJS ์ ๊ฒฝ์ฐ, ์ ์ญ์์์
this
๊ฐ์global
์ด ๋๋ค.
ํจ์ ๋ด๋ถ์ this
๊ฐ์ ํจ์์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ์ ๊ฒฐ์ ๋๋ค.
๋จ์ํ๊ฒ ๋ฉ์๋๋, ๋ด๋ถํจ์, ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ this
๋ ์ ์ญ ๊ฐ์ฒด ์ ๋ฐ์ธ๋ฉ๋๋ค.
function foo() {
console.log("foo's this: ", this); // Window
function bar() {
console.log("bar's this: ", this); // Window
}
bar();
}
foo();
๊ทธ๋ฌ๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์์์ this
๋ ์๊ธฐ ์์ ์๊ฒ ๋ฐ์ธ๋ฉ๋๋ค.
ํ์ง๋ง ๋ฉ์๋์ ๋ด๋ถ ํจ์๋ ์ ์ญ ๊ฐ์ฒด์ this
๊ฐ์ด ๋ฐ์ธ๋ฉ ๋๋ค.
var value = 1;
const obj = {
value: 100,
qux: function() {
console.log(this.value); // this === obj, 100 ์ถ๋ ฅ
setTimeout(
// ๋ฉ์๋์ ๋ด๋ถ ํจ์
function() {
console.log(this); // this === Window, Window ์ถ๋ ฅ
console.log(this.value); // 1 ์ถ๋ ฅ
}, 0);
}
}
obj.qux();
call()
, apply()
, bind()
call()
, apply()
, bind()
์ฌ์ฉํ์ฌ this
๊ฐ์ ์ค์ ํ ์ ์๋ค.
call()
: ์ด๋ฏธ ํ ๋น๋์ด ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํจ์/๋ฉ์๋๋ฅผ ํธ์ถํ๋ ํด๋น ๊ฐ์ฒด์ ์ฌํ ๋นํ ๋ ์ฌ์ฉapply()
: call()
๊ณผ ๋น์ทํ๋ ์ธ์๋ค์ ๋จ์ผ ๋ฐฐ์ด๋ก ๋ฐ๋๋ค.bind()
: this
๊ฐ์ด ๋ฐ์ธ๋ฉ ๋ ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ๋ค.var value = 20;
function mySum(num) {
// this.value ๊ฐ ์๋ ๊ฒฝ์ฐ
if(this.value == undefined) this.value = 50;
return this.value + num;
}
// this ๊ฐ์ ๋ฐ๋ก ์ง์ ํ์ง ์์ global ๊ฐ์ฒด(window)๊ฐ this๊ฐ ๋จ
console.log(mySum(2)); // 22
// call()
console.log(mySum.call(mySum, 2)); // 52
// apply()
console.log(mySum.apply(mySum, [9])); // 59
// bind()
var bindMySum = mySum.bind(mySum);
console.log(bindMySum(50)); // 100
์์ฑ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋กnew
์ฐ์ฐ์, class
์ constructor
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ this
๋ฐ์ธ๋ฉ์ด ์๊ธฐ ์์ ์ผ๋ก ๋๋ค.
function test(number) {
this.num = number;
}
// new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ
var obj = new test(1);
console.log(obj.num); // 1
/* ================ ๋ง์ฝ์ new ๋ฅผ ์ฌ์ฉํ์ฌ obj๋ฅผ ์ ์ธํ์ง ์์ ๊ฒฝ์ฐ ================ */
// ํจ์๋ด์์ this.num ์ window.num ์ผ๋ก ๋ฐ์ธ๋ฉ ๋๋ค.
console.log(obj.num); // Uncaught TypeError
์์ฑ์๋ฅผ ํตํด ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ผ๋ก ๋์ํ๋ค.
this
๋ฐ์ธ๋ฉthis
๊ฐ ์ด ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด)this.๋ฉ์๋
, this.์์ฑ
๋ฑ this
๋ฅผ ํตํด ์์ฑํ ์์ฑ์ ๋ฉ์๋๋ ์๋ก ์์ฑ๋ ๊ฐ์ฒด์ ์ถ๊ฐํจreturn
)์ด ์์ผ๋ฉด ์๋ฌต์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํthis
๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด๊ฐ ๋ฐํ๋จfunction Obj(num) {
// ์์ฑ์ ํจ์ ์ฝ๋ ์คํ ์ ---------- 1
this.num= num; // ---------- 2
// ์์ฑ๋ ํจ์ ๋ฐํ ------------------3
}
var me = new Obj(33);
console.log(me.num);
๋ฐ๋ผ์, new
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํจ์๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ
๊ฐ์ฒด๋ฅผ ์๋ฌต์ ์ผ๋ก ์์ฑํ์ฌ ๋ฐํํ์ง ์์ผ๋ฉฐ this
๋ ์ ์ญ ๊ฐ์ฒด ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๐ ๊ฐ์ฒด ๋ฆฌํฐ๋ด vs ํจ์
๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์๊ณผ ํจ์ ๋ฐฉ์์ ์ฐจ์ด๋
[[Prototype]]
(ํ๋กํ ํ์ ๊ฐ์ฒด) ์ ์๋ค.// ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์ // [[Prototype]] : Object.prototype var obj = { name: "dulli", age: 100 } // ํจ์ ๋ฐฉ์ // [[Prototype]] : obj.prototype function obj2() { this.name: "ddochi", age: 35 } var objIns = new obj2();
strict ๋ชจ๋ ๋ผ๋ฉด this
๊ฐ์ undefined
๊ฐ ๋๋ค.
// ํจ์ ๋ด์์ use strict ๋ชจ๋ ํ์ฑํ
function test() {
"use strict";
return this; // ์ฌ๊ธฐ์ this๋ undefined
}
console.log(this); // Window, ์ ์ญ ๊ฐ์ฒด
console.log(test()); // undefined
JavaScript์์๋ this
๊ฐ์ ์คํ ์ปจํ
์คํธ์ thisValue
์ ์ํด ๊ฐ์ด ๋ฐ์ธ๋ฉ ๋๋ค.
thisValue
๋ ์๋์ 5๊ฐ์ง ํจํด์ ์ํด ๊ฒฐ์ ์ด๋๋ค.
this === ์ ์ญ๊ฐ์ฒด
this === ์ ์ญ๊ฐ์ฒด
๋ฉ์๋์์์ this === ์๊ธฐ์์
๋ฉ์๋์ ๋ด๋ถ ํจ์์ this === ์ ์ญ๊ฐ์ฒด
call()
, apply()
, bind()
: this
๊ฐ์ด ๋งค๊ฐ๋ณ์์ ๋ฐ์ธ๋ฉ๋จthis === ์๊ธฐ์์
this === undefined
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this
https://hyunseob.github.io/2016/03/10/javascript-this/
https://muckycode.blogspot.com/2015/04/javascript-this.html
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/์ ๋ก์ฐ_ํ์