๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Javascript

์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์— ๋‹ค๋ฅธ ๊ฐ’ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ

๐Ÿค” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๊ฐ€ ๋ฌธ๋งฅ์— ๋งž๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ?

๐Ÿค” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this์— ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•

<์ „ํ†ต์  ๋ฐฉ์‹>

์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ๊ฐ•์ œ๋กœ this๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์—์„œ ์‚ด์ง ๋‹ค๋ค˜๋˜ ๋ฐฉ์‹์ด์—์š” ๐Ÿ‘€

var obj1 = {
	name: 'obj1',
	func: function() {
		var self = this; //์ด ๋ถ€๋ถ„!
		return function () {
			console.log(self.name);
		};
	}
};

// ๋‹จ์ˆœํžˆ ํ•จ์ˆ˜๋งŒ ์ „๋‹ฌํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, obj1 ๊ฐ์ฒด์™€๋Š” ์ƒ๊ด€์ด ์—†์–ด์š”.
// ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•˜์ฃ .
var callback = obj1.func();
setTimeout(callback, 1000);

์‹ค์ œ๋กœ๋Š” this๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๊ธฐ๋„ ํ•˜๊ณ , ๋ฒˆ๊ฑฐ๋กญ๋„ค์š”.

๊ทธ๋ ‡๋‹ค๋ฉด, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์•„์— this๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”?

var obj1 = {
	name: 'obj1',
	func: function () {
		console.log(obj1.name);
	}
};
setTimeout(obj1.func, 1000);

์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ธด ํ•ด์š”. ํ•˜์ง€๋งŒ this๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์„œ **๊ฒฐ๊ณผ๋งŒ์„ ์œ„ํ•œ ์ฝ”๋”ฉ**์ด ๋˜์–ด๋ฒ„๋ ธ๋„ค์š”. this๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๋†“์น˜๊ฒŒ ๋จ

์˜คํžˆ๋ ค, ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ๋ฅผ ์žฌํ™œ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ ํšŒํ•ด๋ณผ๊นŒ?

์ฝ”๋“œ๊ฐ€ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ, VSCode ์ƒ์—์„œ ์ง์ ‘ function์„ ๋Œ€์ž…ํ•ด๋ณด๋ฉด์„œ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ๊ฐ€์‹œ๊ธฐ ๋ฐ”๋ž˜์š”!

var obj1 = {
	name: 'obj1',
	func: function() {
		var self = this; //์ด ๋ถ€๋ถ„!
		return function () {
			console.log(self.name);
		};
	}
};

// ---------------------------------

// obj1์˜ func๋ฅผ ์ง์ ‘ ์•„๋ž˜์— ๋Œ€์ž…ํ•ด๋ณด๋ฉด ์กฐ๊ธˆ ๋” ๋ณด๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค!
var obj2 = {
	name: 'obj2',
	func: obj1.func
};
var callback2 = obj2.func();
setTimeout(callback2, 1500);

// ์—ญ์‹œ, obj1์˜ func๋ฅผ ์ง์ ‘ ์•„๋ž˜์— ๋Œ€์ž…ํ•ด๋ณด๋ฉด ์กฐ๊ธˆ ๋” ๋ณด๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค!
var obj3 = { name: 'obj3' };
var callback3 = obj1.func.call(obj3);
setTimeout(callback3, 2000);

์œ„ ๋ฐฉ๋ฒ•์€ ์กฐ๊ธˆ ๋ฒˆ๊ฑฐ๋กญ๊ธด ํ•ด๋„ this๋ฅผ ์šฐํšŒ์ ์œผ๋กœ๋‚˜๋งˆ ํ™œ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์—ˆ์–ด์š”!

์ง€๊ธˆ๊นŒ์ง€ ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋˜ ๋ชจ์Šต์„ ๋ณด์—ฌ๋“œ๋ ธ์–ด์š”. ํ•˜์ง€๋งŒ ์ด์ œ๋Š” ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์„ ์•„์ฃผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ๋ฐ”๋กœ **bind ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•**์ด์—์š”.

<๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ• → bind๋ฉ”์„œ๋“œ์˜ ํ™œ์šฉ>

var obj1 = {
	name: 'obj1',
	func: function () {
		console.log(this.name);
	}
};
//ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ obj1์— ๋ฐ”์ธ๋”ฉ
//obj1.func๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌด์กฐ๊ฑด this๋Š” obj1๋กœ ๊ณ ์ •ํ•ด์ค˜!
setTimeout(obj1.func.bind(obj1), 1000);

var obj2 = { name: 'obj2' };
//ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ obj2์— ๋ฐ”์ธ๋”ฉ
//obj1.func๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌด์กฐ๊ฑด this๋Š” obj2๋กœ ๊ณ ์ •ํ•ด์ค˜!
setTimeout(obj1.func.bind(obj2), 1500);