220815(์)
๐ชด ์ฑ์ฅ์ผ์ง
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
๐ณ ํค์๋ ์ต๋ํ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ, ์ถํ์ ๋ณด๋ฉด์ ์ค์ค๋ก ์ค๋ช
JavaScript
์ฝ๋ฐฑ ํจ์
๋ค๋ฅธ ์ฝ๋์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ํจ์
์ฝ๋ฐฑ ํจ์๋ฅผ ๋๊ฒจ๋ฐ์ ์ฝ๋๋ ํ์์ ๋ฐ๋ผ ์ ์ ํ ์์ ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํ(์ฝ๋ฐฑ ํจ์์ ์ ์ด๊ถ
์ ๋๊ธฐ๋ ๊ฒ)
์ฝ๋ฐฑ ํจ์ ์์
var count = 0;
var timer = setInterval(function () {
console.log(count);
if (++count > 4) clearInterval(timer);
}, 3000);
์ผ๋ฐ์ ์ธ ์ฝ๋๋ ์ฌ์ฉ์(์ ์ )๊ฐ ํธ์ถ ์ฃผ์ฒด์ด๋ฉด์ ์ ์ด๊ถ์ ๊ฐ์ง๋ ๋ฐ๋ฉด, ์ฝ๋ฐฑ ํจ์๋ ํน์ ์ฝ๋์๊ฒ ์ ์ด๊ถ์ ๋๊ฒจ์ค
์ฝ๋ฐฑ ํจ์ ์์2
var newArr = [10, 20, 30].map(function (value, index) {
console.log(value, index);
return value + 5;
});
์์ ๊ฐ์ด ์ฝ๋ฐฑ ํจ์์ ์ข
๋ฅ์ ๋ฐ๋ผ ๋๊ฒจ์ค์ผํ๋ ์ธ์๊ฐ ์ ๊ฐ๊ฐ
์ ์ด๊ถ์ ๊ฐ๋ ํจ์ ํน์ ๋ฉ์๋๊ฐ ์ด๋ค ์ธ์๋ฅผ ์ด๋ป๊ฒ ๋ฐ์์ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ๊ผญ ํ์ธํด์ผํจ
๋ํ, ์ผ๋ฐ์ ์ผ๋ก thisArg
๋ฅผ ์๋ตํ ๊ฒฝ์ฐ ์ฝ๋ฐฑ ํจ์๋ ์ ์ญ ๊ฐ์ฒด(window)๋ฅผ ๋ฐ์ธ๋ฉ
์์1์ setInterval, setTimeout์ ์ ์ด์ thisArg๋ฅผ ์ธ์๋ก ๋๊ฒจ์ค ์๋ ์์
์ฝ๋ฐฑ ํจ์ ์์3
document.body.innerHTML += '<div id="jay">์๋
</div>';
document.body.querySelector('#jay').addEventListener('click', function (event) {
console.log(this, event);
});
addEventListener์ ๊ฒฝ์ฐ, ์์ฒด์ ์ผ๋ก this๋ฅผ ๊ทธ ์์ ํธ์ถ ์ฃผ์ฒด์ธ document.body.querySelector('#jay')
์ผ๋ก ๋ฐ์ธ๋ฉ
์ฝ๋ฐฑ ํจ์๋ ๊ฒฐ๊ตญ ํจ์
์ด๋ค ๊ฐ์ฒด์ ๋ฉ์๋๋ก์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํ๋๋ผ๋ ๊ทธ ๋ฉ์๋์ this binding๊ณผ๋ ๋ณ๊ฐ๋ก ๊ทธ์ ํจ์๋ก์ ์๋
var obj = {
arr: [1, 2, 3],
method: function (value, index) {
console.log(this, value, index); // ๋ฉ์๋๋ก์ ํธ์ถ ์ this๋ obj ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉ
},
}[(4, 5, 6)].forEach(obj.method); // this๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉ(์ฝ๋ฐฑ ํจ์์์ ๋ฐ๋ก ์ง์ ํ์ง ์์์ผ๋ฏ๋ก)
// ์ฝ๋ฐฑ ํจ์์ ์ํ๋ this ๋ฐ์ธ๋ฉํ๊ธฐ
var arr2 = [4, 5, 6];
arr2.forEach(obj.method.bind(arr2)); // this์ arr2๊ฐ ๋ฐ์ธ๋ฉ๋จ
์ฝ๋ฐฑ ์ง์ฅ๊ณผ ๋น๋๊ธฐ ์ ์ด์ ๋ณ์ฒ์ฌ
- ์ฝ๋ฐฑ ์ง์ฅ: ์ฝ๋ฐฑ ํจ์๋ฅผ ์ต๋ช ํจ์๋ก ์ ๋ฌํ๋ ๊ณผ์ ์ด ๋ฐ๋ณต๋๋ฉฐ ์ฝ๋์ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๊ฐ๋นํ๊ธฐ ํ๋ค ์ ๋๋ก ๊น์ด์ง๋ ํ์
- ๋น๋๊ธฐ ์ ์ด์ ๋ณ์ฒ์ฌ: setTimeout/setInterval -> Promise, Generator -> async/await
๐๐๐ JavaScript
ํด๋ก์
ํด๋ก์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฟ ์๋๋ผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ฑ์ฅํ๋ ๋ณดํธ์ ์ธ ํน์ฑ
์ด๋ค ํจ์ A(์ธ๋ถํจ์)์์ ์ ์ธํ ๋ณ์ a๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถํจ์ B๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ, A์ ์คํ ์ปจํ
์คํธ๊ฐ ์ข
๋ฃ๋ ์ดํ์๋ ๋ณ์ a๊ฐ ์ฌ๋ผ์ง์ง ์๋ ํ์
ํด๋ก์ ์ ์ ์์์ โ๋ด๋ถํจ์๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ ๊ฒฝ์ฐโ๊ฐ return๋ง ์๋ ๊ฒ ์๋ setInterval, addEventListener๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์๋, ์ฝ๋ฐฑ ํจ์๊ฐ ์ธ๋ถ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ํด๋ก์ ๋ฐ์ ์ฝ๋ฐฑ ํจ์๋ ์์ ํ ์ข ๋ฃ๋๋ ๊ฒ์ด ์๋, ๊ทธ ํจ์๋ฅผ ์ ์ดํ๋ ํจ์์ ํน์ ๋์(์ผ์ ์๊ฐ๋ง๋ค, ํด๋ฆญ ์, ์คํฌ๋กค ์ ๋ฑ๋ฑ)์ ๋ฐ๋ผ ๊ณ์ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑ ํจ์๊ฐ ์ธ๋ถ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ํด๋ก์ ๊ฐ ๋ฐ์
// ์์ 1๋ฒ
var outer = function () {
var a = 1;
var inner = function () {
console.log(++a);
};
return inner();
};
var outer2 = outer();
console.log(outer2); // 2
// ์์ 2๋ฒ
var outer = function () {
var a = 1;
var inner = function () {
console.log(++a);
};
return inner; // ํจ์๋ฅผ ํธ์ถํ์ง ์๊ณ ๊ทธ ํจ์ ์์ฒด๋ฅผ ๋ฆฌํด
};
var outer2 = outer();
console.log(outer2()); // 2
console.log(outer2()); // 3
์์ 1๋ฒ: inner๊ฐ ์คํ๋๊ณ ๋ฆฌํด๋จ์ผ๋ก์จ inner์ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋๋ฉด์ outer์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๋์์ด ์์ด์ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ฝ๋ ํฐ์ ์ํด ์์ฐ์ค๋ฝ๊ฒ ๋ฉ๋ชจ๋ฆฌ์์ ์ฒ๋ฆฌ๋จ
์์ 2๋ฒ: inner๊ฐ ์คํ๋์ง ์๊ณ ๋ฆฌํด๋จ์ผ๋ก์จ, inner์ ์ปจํ ์คํธ(outerEnvironmentReferece)๋ outer์ ์ปจํ ์คํธ(LexicalEnvironment)๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ฏ๋ก outer์ ๋ณ์๊ฐ ๊ฐ๋น์ง ์ฝ๋ ํฐ์ ์ํ ์ ๊ฑฐ ๋์์ ์์ง ์์
ํด๋ก์ ์ ๋ฉ๋ชจ๋ฆฌ
ํด๋ก์ ํ์์ผ๋ก ๋ฐ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ์๋ชจ๋ ๊ทธ์ ํด๋ก์ ์ ๋ณธ์ง์ ์ธ ํน์ฑ
๊ฐ๋ฐ์์ ์๋์ ๋ฌ๋ฆฌ ์ด๋ค ๊ฐ์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋์ง ์์์ ๊ฐ๋น์ง ์ฝ๋ ํฐ์ ์๊ฑฐ ๋์์ด ๋์ง ์๋ ๊ฒฝ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ผ๊ณ ํ ์ ์์ง๋ง, ํด๋ก์ ๋ ์๋์ ์ผ๋ก ์ฐธ์กฐ ์นด์ดํธ๋ฅผ 0์ด ๋๊ฒ ํ์ง ์์์ผ๋ก์จ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ํ์ฉํ๋ ๊ฒ์ด๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ผ๊ณ ๋งํ ์ ์์
๊ทธ๋ฌ๋ฏ๋ก ํด๋ก์ ์ ํ์์ฑ์ด ๋๋ฌ๋ค๋ฉด, ๊ทธ์ ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น์์ฃผ๋ ์์ ์ ํด์ฃผ๋ฉด ํด๊ฒฐ
var outer = (function () {
var a = 1;
var inner = function () {
console.log(++a);
};
return inner;
})();
console.log(outer());
console.log(outer());
console.log(outer());
// ์ด์ ํด๋ก์ ๋ฅผ ์ด์ฉํ ์ผ์ด ์๋ค๋ฉด
outer = null;
// outer ์๋ณ์์ inner ํจ์ ์ฐธ์กฐ๋ฅผ ๋์ด๋ฒ๋ฆฌ๋ฉด ๋์ด์ inner๊ฐ ํธ์ถ๋ ์ผ์ด ์๊ณ
// ๊ทธ์ ๋ฐ๋ผ ์ธ๋ถํจ์์ ๋ณ์ a๋ฅผ ์ฐธ์กฐํ ์ผ์ด ์๊ฒ ๋๋ฏ๋ก ๊ฐ๋น์ง ์ฝ๋ ํฐ์ ์ํด ์ ๊ฑฐ๋จ