this

this๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋งฅ๋ฝ(context)๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋งฅ๋ฝ์ด๋ผ๋Š” ๊ฒƒ์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง„๋‹ค๋Š” ์˜๋ฏธ์ธ๋ฐ, ์ฆ‰, ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ์„œ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด ๋‹ฌ๋ผ์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ์ฒด ์•ˆ์˜ ๋ฉ”์†Œ๋“œ์—์„œ this๊ฐ€ ๋‚˜์˜ค๋ฉด ์ด๊ฒƒ์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์†ํ•ด์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ํ•จ์ˆ˜์™€ ๊ฐ์ฒด์˜ ๊ด€๊ณ„๊ฐ€ ๋Š์Šจํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ this๋Š” ์ด ๋‘˜์„ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ์‹ค์งˆ์ ์ธ ์—ฐ๊ฒฐ์ ์˜ ์—ญํ• ์„ ํ•œ๋‹ค

function func() {
    if(window === this) {
        console.log("window === this");
    }
}

์œ„์˜ funcํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด "window === this"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ์ด๊ฒƒ์„ ํ•ด์„ํ•ด๋ณด๋ฉด, func ํ•จ์ˆ˜ ๋‚ด์—์„œ this๋Š” ์›น๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ „์—ญ๊ฐ์ฒด์ธ window๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ƒ์„ฑ์ž์™€ this

ํ•จ์ˆ˜ ์•ˆ์—์„œ this๋Š” ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์†ํ•ด์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ๊ฐ์ฒด์ผ์ˆ˜๋„ ์žˆ๊ณ  ์ „์—ญ๊ฐ์ฒด์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

var funcThis = null;

function Func(){//๊ฒฐ๊ตญ this null์ด ๋œ๋‹ค.
    funcThis = this;//Func์˜ this๊ฐ€ funcThis์— ํ• ๋‹น๋˜๋Š”๋ฐ, ์•ž์— var๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
}
var o1 = Func();
if(funcThis === window) {//์ „์—ญ๊ฐ
    document.write('window </br>');
}
//new Func() ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋Š” ๋ณ€์ˆ˜ o2์— ๋‹ด๊ธด๋‹ค.
var o2 = new Func();//์ƒ์„ฑ์ž๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋นˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด this๋Š” ์ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
if(funcThis === o2) {
    document.write('window </br>');
}

๋˜‘๊ฐ™์€ ํ•จ์ˆ˜์ง€๋งŒ, ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉ๋˜๋ฉด this๋Š” ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋˜๊ณ , ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์ด ํ•จ์ˆ˜ ์•ˆ์—์„œ this๋Š” window๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ž ์•ˆ์—์„œ this๊ฐ€ ๋œ๋‹ค.(์ƒ์„ฑ์ž ์•ˆ์—์„œ this๋Š” ์ƒ์„ฑ์ž๊ฐ€ ๋งŒ๋“  ๊ฐ์ฒด์ด๋‹ค.)

apply์™€ call

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์œ ์—ฐํ•œ์ง€๋ฅผ ๊ทน๋ช…ํ•˜๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค. ํ•จ์ˆ˜๋„ ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์„ ๋‹ค์‹œ ๋– ์˜ฌ๋ ค๋ณด์ž. ํ•จ์ˆ˜๋„ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— property(์†์„ฑ)์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์†์„ฑ ์ค‘์— apply์™€ call์ด ์žˆ๋‹ค.

function sum(x,y){return x+y;}//ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด(literal)
sum(1,2);//3
var sum2 = new Function('x','y','return x+y');

์ฒซ๋ฒˆ์งธ, ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜๊ณ , ๋งˆ์ง€๋ง‰ ์ธ์ž๋Š” ํ•จ์ˆ˜ sum์˜ ๋ณธ๋ฌธ์— ํ•ด๋‹นํ•œ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ new๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ฆฌํ„ฐ๋Ÿด์ด๋ผ๋Š” ๋ฌธ๋ฒ•์  ์ฒด๊ณ„๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•˜๋‹ค.

var sum2 = new Function('x','y','return x+y');

ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด : function sum (x,y) {...}

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด : var o = {...}

๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด : var a = [1,2,3];

apply์™€ this

var o = {}
var p = {}
function func(){
    switch(this) {
        case o:
            document.write('o<br />');
            break;
        case p:
            document.write('p<br />');
            break;
        case window:
            document.write('window<br />');
            break;
    }
}
func();//ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•˜๋ฉด window๊ฐ€ ์ถœ๋ ฅ.
func.apply(o);//ํ•จ์ˆ˜ func๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ธ์ž๋กœ o๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
func.apply(p);//ํ•จ์ˆ˜ func๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ธ์ž๋กœ p๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

Last updated