์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - this, bind

2022. 5. 7. 17:34ใ†javascript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - this, bind

 

(ํ•ด๋‹น ๋‚ด์šฉ์€ smashingmagazine ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ œ์ž‘ํ•˜์˜€์Œ.)

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•™์Šตํ•˜๋‹ค๋ณด๋ฉด ์˜๋„ํ•˜๋Š” context๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž์ฒด์˜ ๊ทœ์น™์ด ์กด์žฌํ•œ๋‹ค๋Š” ์ฆ๊ฑฐ์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ํ•™์Šตํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ค„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

๋จผ์ € ์•„๋ž˜ ์ฝ”๋“œ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž. 

 

var myObj = {

    specialFunction: function () {

    },

    anotherSpecialFunction: function () {

    },

    getAsyncData: function (cb) {
        cb();
    },

    render: function () {
        var that = this;
        this.getAsyncData(function () {
            that.specialFunction();
            that.anotherSpecialFunction();
        });
    }
};

myObj.render();

 

๊ฒฐ๊ณผ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์œ„ ์ฝ”๋“œ๋Š” ์ œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ renderํ•จ์ˆ˜์—์„œ that.specialFunction()์ด ์•„๋‹Œ this.specialFunction์„ ํ–ˆ์–ด๋„ ๋™์ž‘ํ–ˆ์„๊นŒ? 

์ •๋‹ต์€ ์•„๋‹ˆ๋‹ค. renderํ•จ์ˆ˜์— ๋“ค์–ด์˜ค๋Š” this๋Š” ๊ฐ์ฒด myObj๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ทธ ์•ˆ์— getAsyncData๋ฅผ ํ†ตํ•ด์„œ ์ƒˆ๋กœ์šด function (์ฝœ๋ฐฑํ•จ์ˆ˜)๋กœ ๋“ค์–ด์™”๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ณณ์—์„œ context๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. 

 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์œ„ ์ฝ”๋“œ์—์„œ var that = this๋ผ๋Š” myobj์˜ this๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์˜€๊ณ  ์ด ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ•จ์ˆ˜๋“ค์„ ํ˜ธ์ถœํ•˜์˜€๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์ด ๋‚˜์œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅํ•จ์ˆ˜์—๋Š” ์ด๋Ÿฌํ•œ context๋ฅผ ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” bind()ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

bind()

bind()๋Š” Function ํ”„๋กœํ† ํƒ€์ž…์˜ ๋‚ด์žฅํ•จ์ˆ˜๋กœ์„œ ์‹คํ–‰๋์„ ๋•Œ ์ œ๊ณต๋œ value๊ฐ’์œผ๋กœ this๊ฐ€ ์„ธํŒ…๋œ ์ƒํƒœ๋กœ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์œ„์˜ renderํ•จ์ˆ˜๋ฅผ bind๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

render: function () {
    this.getAsyncData(function () {
    	this.specialFunction();
        this.anotherSpecialFunction();
    }.bind(this));
}

bind์˜ ์ธ์ž๋กœ ๋“ค์–ด์˜จ this๋ฅผ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ์ „๋‹ฌํ•จ์œผ๋กœ์จ this context๊ฐ€ ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

Function.prototype.bind์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Function.prototype.bind = function (scope) {
    var fn = this;
    return function () {
        return fn.apply(scope);
    };
}

 

์•„๋ž˜๋Š” bind๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค๋ฅธ ์˜ˆ์‹œ์ด๋‹ค.

 

var foo = {
    x: 3
}

var bar = function(){
    console.log(this.x);
}

bar(); // undefined

var boundFunc = bar.bind(foo);

boundFunc(); // 3

 

์ฆ‰ ์ฝœ๋ฐฑ์—์„œ this๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ค˜์•ผ ์ž‘๋™ํ•œ๋‹ค.

'javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ํด๋กœ์ €  (0) 2022.04.07