22.08.16 ์์ ์ ํตํด ๊ณต๋ถํ ๋ด์ฉ๋ค์ ์ ๋ฆฌํ์์ต๋๋ค ๐
ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค! ๐
// ์๋ ์ฝ๋์์ var๋ก ์ ์ธ๋ ๋ชจ๋ i๋ ๊ฐ์ ์ค์ฝํ๋ฅผ ๊ณต์ ํฉ๋๋ค.
// for๋ฌธ์ด ์ข
๋ฃ๋ ํ์ setTimeout์ด ์คํ๋๋ฏ๋ก i๋ ์ด๋ฏธ 5์
๋๋ค.
var i = 10;
for (var i = 0; i < 5; i++) {
console.log(i, '๋ฒ์งธ for ๋ฌธ์ด ๋จผ์ ์คํ๋ฉ๋๋ค');
setTimeout(function count() {
console.log(i)
}, 100);
}
console.log(var)
// ์ฆ์ ์คํ ํจ์
// ์๋์ฒ๋ผ ์คํํด๋ ๊ฒฐ๊ตญ i๊ฐ 5๋ก ๋ณํ ๋ค setTimeout์ด ์คํ๋๋ฏ๋ก ๊ฒฐ๊ณผ๋ ๊ฐ์ต๋๋ค.
for (var i = 0; i < 5; i++) {
console.log(i, '๋ฒ์งธ for ๋ฌธ์ด ๋จผ์ ์คํ๋ฉ๋๋ค');
(function() { setTimeout(function count() {
console.log(i)
}, 100);})();
}
// ์ฆ์ ์คํ ํจ์
// ๋ณํํ๋ i๋ฅผ ์ค๋
์ท์ ์ฐ๋ฏ ์ฆ์ ์คํ ํจ์๋ก ์์ฑ๋ ์ค์ฝํ๋ก ๊ฐ์ ธ์ค๋ฉด ์๋์ฒ๋ผ ๋์ํฉ๋๋ค.
for (var i = 0; i < 5; i++) {
console.log(i, '๋ฒ์งธ for ๋ฌธ์ด ๋จผ์ ์คํ๋ฉ๋๋ค');
(function() {
var j = i;
setTimeout(function count() {
console.log(j)
}, 100);})();
}
// i๋ฅผ ์ธ์๋ก, j๋ฅผ ๋งค๊ฐ๋ณ์๋ก ํ๋ ์์ ๊ฐ์ด ๋์ํ๋ ์ฝ๋์
๋๋ค.
for (var i = 0; i < 5; i++) {
(function(j) {
setTimeout(function count() {
console.log(j)
}, 100);})(i);
}
// ์ฌ์ค var๋ฅผ let์ผ๋ก ๋์ฒดํ๋ฉด ์ด ์ค์ฝํ ๋ฌธ์ ๊ฐ ์ฝ๊ฒ ํด๊ฒฐ๋ฉ๋๋ค.
// let i = 0์ธ ์ค์ฝํ, let i = 1์ธ ์ค์ฝํ ... ๊ฐ ๊ฐ๊ฐ ์์ฑ๋์ด ์๋๋๋ก ๋์ํฉ๋๋ค.
for (let i = 0; i < 5; i++) {
setTimeout(function count() {
console.log(i)
}, 100);
}
์๋ณ์ ๊ฒฐ์ ์ ์ํด
๋ณ์๋ฅผ ์ ์ธํ๋ค๋ ๊ฒ์ ์๋ณ์์ ์กด์ฌ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์๊ฒ ์๋ฆฌ๋ ๊ฒ์ธ๋ฐ, ์๋ณ์๊ฐ ์๋์ง ์๋์ง ์์์ผ ๋๊ธฐ ๋๋ฌธ์, ์ด ์ ์ธ์ ์ํด์ ์๋ ค์ฃผ๋ ๊ฒ์.
์์ฑ๋ค์ ๋์ด์ ์๋ฏธํจ. ์ด ๊ฐ์ฒด์ ์์ฑ์ ์ ์ํ๋ ๊ฒ์ด ์ถ์ํ์.
Object๋ผ๊ณ ๋ ํ๋ฉฐ, Subject๊ฐ ์ธ์ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํจ. ์ฌ๊ธฐ์ ์ฃผ์ฒด๋ ๊ฐ๋ฐ์๋ผ๊ณ ์๊ฐํ๋ฉด ์ข์.
ํ๋กํผํฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์๋ฏธ. ์ฆ, ํ๋กํผํฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ ๊ฐ์ฒด๋ผ๊ณ ์ด์ผ๊ธฐ ํ ์ ์์.
์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ด๋ฉฐ,
๊ฐ์ฒด๊ฐ ์ค์ ๋ก ๊ฐ์ง๊ณ ์๋ ํ๋กํผํฐ์ callee, length, symbol ๋ฑ๋ฑ์ enumerable์ด false์ด๊ธฐ ๋๋ฌธ์ ์๊น์ด ๋ค๋ฅด๊ณ , ์์๋ฐ์ ์์ฑ๋ค์ [[Prototype]]์ ๋ด๊ฒจ ์์.
์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ฒ๋ผ ์ํํ๋ ๊ฒ.
๊ฐ์ฒด๊ฐ ๋ฐฐ์ด๋ณด๋ค ๋์ ์ ํ๋๊ฐ ์๋๋ฐ, ๊ทธ๊ฒ ๋ฐ๋ก, ๋ฉ์๋๋ฅผ ์์ ์์ฌ๋ก ๋ฃ์ ์ ์๋ค๋ ๊ฒ์.
ํ์ดํ ํจ์์๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ธ arguments ๊ฐ์ฒด๊ฐ ์์.
๊ฐ๋ณ ์ธ์ ํจ์๋ฅผ Rest ํ๋ผ๋ฏธํฐ๋ฅผ ์จ์ ํ์ดํ ํจ์์์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์.
//์์ฐ๋ ์๋ ๋ฐฉ๋ฒ. ๋ณ์๋ ๋ง์ด์จ์ผ๋๊ณ ๊ฐ๋
์ฑ ๋จ์ด์ง
const sum = function () {
let res = 0;
for (let i = 0; i < arguments.length; i++) {
res += arguments[i];
}
return res;
}
// ES6 ์ดํ ๋ฐฉ๋ฒ. ๋ณ์๋ ์ ์ฐ๊ผฌ ๊ฐ๋
์ฑ๋ ์ข์!
const sum = function (...args) {
return args.reduce((p, c) => p + c, 0);
}
์์ฑ์ ํจ์๋ ํ๋กํผํฐ ๊ตฌ์กฐ๊ฐ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ ์์ฑํ ๋ ์ ๋ฆฌํจ.
๋ค๋ง, this์ ํ ๋น์ ๋ชปํจ.
์๋ณ์์ ๊ฐ์ ์ด์ด์ฃผ๋ ๊ฒ์ผ๋ก ๊ฑฐ์ ๋ ๊ฐ๊ฐ ๋น์ทํ ๊ฐ๋ ์.
์ฌ์ฌ์ฉ์ ์ํด์!
๋๊ฐ ํ๋๊ฐ? ์ธ์คํด์ค๋ค์ ๋ถ๋ชจ, ์ฆ, ํ๋กํ ํ์ ์ด ํ๋ ๊ฒ์
์์ฑ์ ํจ์์ ๋ด์ฉ์ ํ๋กํ ํ์ ์ผ๋ก ์ฎ๊ธฐ๊ณ , ๊ทธ ์ฎ๊ธด ๋ด์ฉ์ ์ธ์คํด์ค์๊ฒ ์์ํด์ฃผ๋ ค๊ณ .
ํ๋กํผํฐ๋ ๋๋ถ๋ถ ์ธ์คํด์ค๋ง๋ค ๊ฐ์ง๊ณ ์๋๊ฒ ๋ง์.
๋ฉ์๋๋ ํ์์ด๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๊ฐ ๋ค ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์๋๊ณ , ์ฌ๋ ์ด๋ฆ์ด๋ ๋์ด ๊ฐ์ ๊ฒ์ ์ธ์คํด์ค๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์.
function Person(name) {
this.name = name;
Person.prototype.sayHi = function () {
console.log(`Hi! my name is ${this.name}.`);
// ์ด๋ฌ๋ฉด new ํ ๋๋ง๋ค ์ด ๋ฉ์๋๊ฐ ๊ณ์ ์๊ธด๋ค.
};
}
Person.prototype.sayHi = function () {
console.log(`Hi! my name is ${this.name}.`);
// ์ด๋ ๊ฒ ํด์ผ ํ๋๋ง ์์ฑ๋จ.
// ๊ทธ๋ฐ๋ฐ ๊ฐ๋
์ฑ์ ์ธก๋ฉด์์ ์์ฑ์ ํจ์๋ ๊ฐ์ด ์์ด์ผ ๋จ.
// ์ง๊ธ์ ๋ฐ๋ก ๋ฐ์ ์์ง๋ง ์ด๊ฑฐ๋ ์์ ์์ฑ์ํจ์ ์ฌ์ด์ 1000์ค ์ฝ๋ ์์ผ๋ฉด?
// ๊ฐ๋
์ฑ ์์ฒญ๋์จ.
// ๊ทธ๋์ ์ด ๋ ๊ฐ๊ฐ ๋ฑ ๋ฌถ์ฌ์์ผ๋ฉด ์ข๊ฒ ์.
// ์ฆ์ ์คํ ํจ์๋ก ๊ฐ์ธ๋ฉด ๋ฌถ์ ์ ์์.
};
const Person2 = (function () {
function Person2(name) {
this.name = name;
}
Person2.prototype.sayHi = function () {
console.log(`Hi! my name is ${this.name}.`);
};
return Person2;
})();
const me = new Person2('Lee');
// ์ด๋ ๊ฒ ํ๋ฉด ์บก์ํ๊ฐ ๋จ. ๊ทธ๋๋ ์์ฌ์์ด ์์.
// ๊ทธ๋์ ๋์จ ๊ฐ๋
์ด ํด๋์ค!
์ค์ฝํ ์ฒด์ธ์ ๊ฒฝ์ฐ ์๋ณ์ ์ฐธ์กฐ๊ฐ ์์๋๋ ๊ณณ์์๋ถํฐ ์ฐพ๊ธฐ ์์ํจ.
์ธ์คํด์ค๊ฐ ๋ฉ์๋๋ฅผ ์ฐพ์ ๋๋ ์๊ธฐ ์์ ์์ ๋จผ์ ์ฐพ๊ณ , ๊ทธ ๋ ์์ผ๋ฉด ์์ ํ๋กํ ํ์ ์ผ๋ก ์ฌ๋ผ๊ฐ์ ์ฐพ๊ฒ๋จ.
๋ฉ์๋ ์ด๋ฆ์ ์๋ณ์๊ฐ ์๋๋ฉฐ, ๋ง์ฝ ์๋ณ์๋ผ๋ฉด ์ค์ฝํ์ฒด์ธ์์ ์ฐพ์์ผ ํจ.
๊ทธ๋ ์ง๋ง, ํ๋กํ ํ์ ์ ์ฒด์ธ ์์์ ์ฐพ์.
๊ทธ๋์ ํ๋กํผํฐ(๋ฉ์๋)๋ ํ๋กํ ํ์ ์ฒด์ธ์์ ์ฐพ๋ ๊ฒ์ด๊ณ , ์๋ณ์๋ ์ค์ฝํ์ฒด์ธ์์ ์ฐพ์.
me.sayHi();
์์๋ ์๋ณ์์ธ me๋ ์๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๋ค์ด๋ฐ ๊ท์น์ ์ง์ผ์ผ ํจ.
๊ทธ๋ฐ๋ฐ ๋ฉ์๋๋ ํ๋กํผํฐ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ด๋ฐ ๊ท์น์ ์งํค์ง ์์๋ ๋จ!