๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์‹œ๋„/Code-States

[D+22] Java Script ์‹ฌํ™”๊ฐœ๋… 'this'

by ๐Ÿ‡๋ฐ•๋ด‰๋ด‰๐Ÿ‡ 2020. 9. 28.

 

 

D+22

-  Java Script ์‹ฌํ™” ๊ฐœ๋… 'this' -

(this, 'this'๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” 5๊ฐ€์ง€ ํŒจํ„ด)

 


 

 

this

•๋ชจ๋“  ํ•จ์ˆ˜ scope ๋‚ด์—์„œ ์ž๋™์œผ๋กœ ์„ค์ •๋˜๋Š” ํŠน์ˆ˜ํ•œ ์‹๋ณ„์ž

 

•execution context(์‹คํ–‰ ์ฝ˜ํ…์ŠคํŠธ)์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋กœ, ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ด์šฉ ๊ฐ€๋Šฅ

 

 


'this'๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” 5๊ฐ€์ง€ ํŒจํ„ด

• Global : window

 

• Function ํ˜ธ์ถœ : window

 

• Method ํ˜ธ์ถœ : ๋ถ€๋ชจ object

 

• Construction mode

 

• .call or .apply ํ˜ธ์ถœ

 

 

Global & Function ํ˜ธ์ถœ

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

function foo() {
	console.log(this.name); // "Global Variable"
}

foo();

์—ฌ๊ธฐ ํ•จ์ˆ˜ foo๊ฐ€ ์žˆ๊ณ , ์ „์—ญ๋ณ€์ˆ˜๋กœ name์ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ foo๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ฝ˜์†” ๋กœ๊ทธ๋กœ this.name์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์™€

์ „์—ญ์—์„œ this.name์„ ์ฐ์€ ๊ฐ’์ด ๊ฐ™์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์™œ๋ƒํ•˜๋ฉด name์€ ์ „์—ญ์˜์—ญ์ธ window์— ๋ฌถ์—ฌ์žˆ๋Š” ๊ฐ’์ด๋‹ค.

 

๋•Œ๋ฌธ์— name์€ window.name๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ๋”ฐ์ง€๊ฒŒ ๋  ๊ฒฝ์šฐ ์ „์—ญ์˜์—ญ์— ์žˆ๋Š” this๋„ window๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉฐ,

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•จ์ˆ˜ foo์•ˆ์— ์žˆ๋Š” this๋„ window๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ฝ˜์†”๋กœ๊ทธ๋ฅผ ํ†ตํ•œ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…

 

์ฝ˜์†”๋กœ๊ทธ์— ํ•จ์ˆ˜ ์•ˆ์—์„œ๋„ this๊ฐ€ window์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ชจ์Šต

 

var name = 'Global Variable';

function outer() {
	function inner() {
    	console.log(this.name); // "Global Variable"
    }
    
    inner();
}

outer();

์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋„ this๋Š” window๋ฅผ ๊ฐ€๋ฆฌ์ผœ "Global Variable"๋ฅผ ์ฐ์–ด๋‚ด๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰ this๋Š” ์Šค์ฝ”ํ”„๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋ฌถ์—ฌ์žˆ๋‹ค๊ณ  ํ•ด์„œ outer๋‚˜ inner๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ window์ธ this๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

Method ํ˜ธ์ถœ : ๋ถ€๋ชจ object

์œ„์— ๊ฐ™์€ ๊ฒฝ์šฐ์™€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด๋‹ค.

 

๋ถ€๋ชจ ์—†์ด ๋ฐ”๋กœ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋ผ ํ•œ๋‹ค๋ฉด,

๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์€ ๊ฐ์ฒด์— ๋‹ด๊ธด ํ•จ์ˆ˜, ์ฆ‰ ๋ถ€๋ชจ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

์ด๋•Œ, ๋ถ€๋ชจ๊ฐ€ ์žˆ๋Š” ๋…€์„์—์„œ ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, this๋Š” ๋ถ€๋ชจ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋œ๋‹ค.

(๋‹จ, ์ง๊ณ„๋ถ€๋ชจ๋งŒ ๋„์ง‘์–ด๋‚ธ๋‹ค)

 

var obj = {
	fn: function(a, b) {
    	return this;
    }
};
var obj2 = {
	method: obj.fn
};

console.log(obj2.method() === obj2); //true
console.log(obj.fn() === obj); //true

์œ„์— ์‹์—์„œ this๋Š” ์‹คํ–‰์ปจํ…์ŠคํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰๋˜๋Š” ์‹œ์ ์ด ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ ๋…€์„์ด๋ฏ€๋กœ,

์‹คํ–‰๋˜๋Š” ์‹œ์ ์˜ ๋ถ€๋ชจ๋ฅผ ํ™•์ธํ•˜๋ฉด true๊ฐ’์ด ๋‚˜์˜ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Construction mode

new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜ ์˜์—ญ์˜ this๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ด๋•Œ์˜ this๋Š” constructor(์ƒ์„ฑ์ž)๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

 

.call or .apply ํ˜ธ์ถœ

๋ช…์‹œ์ ์œผ๋กœ ๋„˜๊ฒจ์ค„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,

.apply๋Š” ๋ฐฐ์—ด๋กœ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๊ณ , .call์€ ๊ทธ๋ƒฅ ๋‹จ์ˆœํžˆ ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ๋„˜๊ฒจ์ค€๋‹ค๋Š” ์ฐจ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

 


์š”์•ฝ

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€