this

thisλŠ” ν•¨μˆ˜ λ‚΄μ—μ„œ 호좜 λ§₯락(context, 가변적이닀)을 μ˜λ―Έν•œλ‹€. thisλŠ” ν•¨μˆ˜ μ•ˆμ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯ν•˜λ©° μ•½μ†λœ λ³€μˆ˜μ΄λ‹€.

ν•¨μˆ˜κ°€ 어디에 μ†Œμ†λ˜μ–΄ μžˆλŠ”μ§€κ°€ μ€‘μš”ν•˜λ‹€

ν•¨μˆ˜μ—μ„œμ˜ this의 의미

μ²«λ²ˆμ§Έμ˜ˆμ‹œ

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

μ—¬κΈ°μ„œ this λŠ” μœˆλ„μš°λ‹€

λ©”μ†Œλ“œμ˜ 호좜

λ‘λ²ˆμ§Έμ˜ˆμ‹œ

var o = {
    func: function(){
        if(o === this){
            return "o === this";
        }
    }
}
console.log(o.func());

o.func()의 thisλŠ” oλ₯Ό κ°€λ₯΄ν‚¨λ‹€.

전역객체, μ „μ—­λ©”μ†Œλ“œλŠ” windowκ°€ μƒλž΅λ˜μ–΄ μžˆλ‹€. 첫번째 μ˜ˆμ‹œμ˜ thisλŠ”λ©”μ†Œλ“œκ°€ μ†Œμ†λ˜μ–΄ μžˆλŠ” 객체λ₯Ό 가리킨닀. λ‘λ²ˆμ§Έ μ˜ˆμ‹œλŠ” o의 μ†Œμ†μ΄κΈ° λ•Œλ¬Έμ— oλ₯Ό 가리킨닀.

κ·Έλž˜μ„œ ν•¨μˆ˜μ˜ 호좜과 λ©”μ†Œλ“œμ˜ ν˜ΈμΆœμ€ λ‹€λ₯Έκ²Œ μ—†λ‹€. λ‘˜λ‹€ μ†Œμ†λœ 객체λ₯Ό 가리킀고 μžˆλŠ”λ° μƒλž΅λ˜μ–΄ μžˆλŠ”μ§€ μ•„λ‹Œμ§€μ˜ 차이닀.

μƒμ„±μžμ™€ this

var funcThis = null;

function Func(){
    funcThis = this;
}

var o1 = Func();
if(funcThis === window){
    console.log('window');
};

var o2 = new Func();
if(funcThis === o2){
    console.log('o2');
};

o1λŠ” window.Func()κ°€ μƒλž΅λœ κ²ƒμ΄λ―€λ‘œ window λ‹€

o2λŠ” newλ₯Ό λΆ™μ—¬ Func();λ₯Ό μ‹€ν–‰ν–ˆκΈ° λ•Œλ¬Έμ— μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ‚΄λΆ€μ μœΌλ‘œ λΉ„μ—¬μžˆλŠ” 객체λ₯Ό λ§Œλ“€κ³  λΉ„μ—¬μžˆλŠ” 객체가 μƒμ„±μž μ•ˆμ—μ„œ thisκ°€ λœλ‹€.

μƒˆλ‘œ μƒμ„±λ˜λŠ” 객체가 μƒμ„±μž μ•ˆμ—μ„œ thisκ°€ λœλ‹€.

new Func(); κ°€ λ‹€ μ‹€ν–‰λœ ν›„ var o2에 λ‹΄κΈ΄λ‹€.

var funcThis = null;

function Func(){
    if(o2 === this){
        funcThis = this;
    }
}
var o2 = new Func();
if(funcThis === o2){
    console.log('o2');
};

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Func()ν•¨μˆ˜μ•ˆμ— if (o2 === this) .. 라고 λ°”λ‘œ μ“Έ 수 μ—†λ‹€. funcμ•ˆμ—μ„œ ν• κ²½μš° 아직 o2λΌλŠ” 객체에 λ‹΄κΈ°κΈ° 전에 μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— o2λŠ” undefinedκ°€ λœλ‹€.

객체에 λŒ€ν•œ μ΄ˆκΈ°ν™”κ°€ λλ‚œ ν›„, μ–΄λ–€ μ‹λ³„μžμ— λ‹΄κΈ°κΈ° 전에 κ·Έ 객체λ₯Ό μ°Έκ³  ν•  수 μžˆλŠ” reference ??

function Func(){
    this.area = function(){
        if(o2 === this){
            return 'o2 === this';
        }        
    }
}
var o2 = new Func();
o2.area(); //'o2 === this';

ν•˜μ§€λ§Œ μ΄λŸ°μ‹μœΌλ‘œ ν–ˆμ„ κ²½μš°μ—” 'o2 === this'; κ°€ return λœλ‹€.

apply와 this

ν•¨μˆ˜λ„ 객체닀

μ˜ˆμ‹œ1 - sumμ΄λΌλŠ” ν•¨μˆ˜κ°μ²΄ λ§Œλ“€κΈ°

function sum(x,y){
    return x + y;
}
sum(1,2); //3

μ˜ˆμ‹œ2

var sum2 = new Function('x','y','return x + y;');
sum(1,2); //3

newλ₯Ό ν†΅ν•΄μ„œ Functionμ΄λΌλŠ” μ΄λ¦„μ˜ μƒμ„±μž ν•¨μˆ˜λ₯Ό λ§Œλ“  것이닀. 첫번째인자 x, λ‘λ²ˆμ§ΈμΈμž 'y'λŠ” νŒŒλΌλ―Έν„°(λ§€κ°œλ³€μˆ˜)λ₯Ό μ˜λ―Έν•˜κ³  λ§ˆμ§€λ§‰ μΈμžλŠ” ν•¨μˆ˜μ˜ 본문에 ν•΄λ‹Ήλœλ‹€.

μ˜ˆμ‹œ2처럼 μž‘μ„±ν•˜λŠ”κ²ƒμ€ λŒ€λ‹¨νžˆ λΆˆνŽΈν•˜λ‹€. 특히 μ˜ˆμ‹œ2의 λ§ˆμ§€λ§‰ 인자처럼 λŒ€λ‹¨νžˆ κΈ΄λ‚΄μš©μ΄λ©΄ λ”λ”μš± λΆˆνŽΈν•  것이닀.

μ˜ˆμ‹œ1처럼 μž‘μ„±ν•˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 해석기가 ν•¨μˆ˜ 객체둜 λ§Œλ“€μ–΄ μ£ΌλŠ” 것이닀. ->ν•¨μˆ˜ λ¦¬ν„°λŸ΄(Literal).

λ¦¬ν„°λŸ΄(Literal)

//객체 λ¦¬ν„°λŸ΄
var o = {}
//ν•¨μˆ˜ λ¦¬ν„°λŸ΄
var arr = {}

new Object λ‚˜ new Array둜 λͺ…μ‹œμ μœΌλ‘œ λ§Œλ“€ 수 μžˆμ§€λ§Œ λ¦¬ν„°λŸ΄ 방식이라고 νŽΈλ¦¬ν•˜κ²Œ λ§Œλ“€ 수 μžˆκ²Œν•œλ‹€.

var o = {};
var p = {};
function func(){
    switch(this){
        case o:
            console.log('o');
            break;
        case p:
            console.log('p');
            break;
        case window:
            console.log('window');
            break;
    }
}
func(); //'window'
func.apply(o); //'o'
func.apply(p); //'p'

funcλŠ” 객체이기 λ•Œλ¬Έμ— ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. apply의 첫번째 인자둜 ν•¨μˆ˜ 호좜 μ»¨ν…μŠ€νŠΈ(context,λ§₯락,가변적이닀.)λ₯Ό λŒ€μž…ν•œλ‹€.

전톡적인 객체지ν–₯μ—μ„œ λ©”μ†Œλ“œλΌλŠ” 것은 객체에 κ°•ν•˜κ²Œ μ†Œμ†λ˜μ–΄ μžˆλ‹€. ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μœ μ—°ν•˜λ‹€.

apply μ„€λͺ… 이미지

applyλ₯Ό μ΄μš©ν•΄ 호좜 ν•˜λ‹ˆ ν•¨μˆ˜ func()λŠ” p의 λ©”μ†Œλ“œλ„ 되고 o의 λ©”μ†Œλ“œλ„ 됐닀. 객체와 ν•¨μˆ˜λŠ” 맀우 λŒ€λ“±ν•˜λ‹€. μ™œλƒλ©΄ ν•¨μˆ˜λ„ 객체이기 λ•Œλ¬Έμ΄λ‹€. ν•¨μˆ˜λ₯Ό μ–΄λ–»κ²Œ ν˜ΈμΆœν–ˆλƒκ°€ ν¬μΈνŠΈλ‹€. μ–΄λ–»κ²Œ ν˜ΈμΆœν–ˆλƒμ— 따라 μ–΄λ–€ 객체에 μ’…μ†λ˜μ—ˆλŠ”μ§€κ°€ 달라진닀.

thisλŠ” λ³€ν™”λ¬΄μŒν•˜λ‹€. ν•¨μˆ˜κ°€ 어디에 μ†Œμ†λ˜μ–΄ μžˆλŠ”μ§€κ°€ μ€‘μš”ν•˜λ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μœ μ—°ν•˜λ‹€.

Last updated

Was this helpful?