β λ€μκ³Ό κ°μ 쑰건μ λ§μ‘±νλ κ°μ²΄λ₯Ό
μΌκΈ κ°μ²΄
λΌκ³ νλ€.
β 무λͺ μ 리ν°λ΄λ‘ μμ±ν μ μλ€. μ¦, λ°νμμ μμ±μ΄ κ°λ₯νλ€.
β λ³μλ μλ£κ΅¬μ‘°(κ°μ²΄, λ°°μ΄ λ±)μ μ μ₯ν μ μλ€.
β ν¨μμ 맀κ°λ³μμ μ λ¬ν μ μλ€.
β ν¨μμ λ°ν κ°μΌλ‘ μ¬μ©ν μ μλ€.
π μλ°μ€ν¬λ¦½νΈμ ν¨μλ μμ 쑰건μ λͺ¨λ λ§μ‘±νλ―λ‘ μΌκΈ κ°μ²΄λ€.
// 1. ν¨μλ 무λͺ
μ 리ν°λ΄λ‘ μμ±ν μ μλ€.
// 2. ν¨μλ λ³μμ μ μ₯ν μ μλ€.
// λ°νμ(ν λΉ λ¨κ³)μ ν¨μ 리ν°λ΄μ΄ νκ°λμ΄ ν¨μ κ°μ²΄κ° μμ±λκ³ λ³μμ ν λΉλλ€.
const increase = function (num) {
return ++num;
}
const decrease = function(num) {
return --num;
}
// 2. ν¨μλ κ°μ²΄μ μ μ₯ν μ μλ€.
const auxs = {increase, decrease};
// 3. ν¨μμ 맀κ°λ³μμ μ λ¬ν μ μλ€.
// 4. ν¨μμ λ°νκ°μΌλ‘ μ¬μ©ν μ μλ€.
function makeCounter(aux) {
let num = 0;
return function() {
num = aux(num);
return num
};
}
// 3. ν¨μλ 맀κ°λ³μμκ² ν¨μλ₯Ό μ λ¬ν μ μλ€.
const increaser = makeCounter(auxs.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2
// 3. ν¨μλ 맀κ°λ³μμκ² ν¨μλ₯Ό μ λ¬ν μ μλ€.
const decreaser = makeCounter(auxs.decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2
ν¨μκ°
μΌκΈ κ°μ²΄
λΌλ κ²μ ν¨μλ₯Ό κ°μ²΄μ λμΌν κ² μ¬μ©ν μ μλ€λ μλ―Έ. μ¦, κ°μ²΄λ κ°μ΄λ―λ‘ ν¨μλ κ°κ³Ό λμΌνκ² μ·¨κΈ.
ν¨μλ κ°μ μ¬μ©ν μ μλ κ³³(λ³μ ν λΉλ¬Έ
,κ°μ²΄μ νλ‘νΌν° κ°
,λ°°μ΄μ μμ
,ν¨μ νΈμΆμ μΈμ
,ν¨μ λ°νλ¬Έ
)μ΄λΌλ©΄ μ΄λμλ μ§λ¦¬ν°λ΄
λ‘ μ μν μ μμΌλ©°λ°νμ
μ ν¨μ κ°μ²΄λ‘ νκ°
μΌκΈ κ°μ²΄
λ‘μ ν¨μκ° κ°μ₯ κ°μ§λ κ°μ₯ ν° νΉμ§μ
1. ν¨μμ맀κ°λ³μ
μ μ λ¬ν μ μλ€.
2. ν¨μμλ°νκ°
μΌλ‘ μ¬μ©ν μ μλ€.
μ΄λ
ν¨μν νλ‘κ·Έλλ°
μ κ°λ₯μΌ νλ μλ°μ€ν¬λ¦½νΈμ μ₯μ μ€ νλ
μΌλ° κ°μ²΄
νΈμΆν μ μκ³ ,ν¨μ κ°μ²΄
λ νΈμΆν μ μμΌλ©°ν¨μ κ°μ²΄
λμΌλ° κ°μ²΄
μλ μλ ν¨μ κ³ μ μ νλ‘νΌν°λ₯Ό μμ νλ€.
ν¨μλ κ°μ²΄μ΄λ―λ‘ νλ‘νΌν°λ₯Ό κ°μ§ μ μλ€.
console.dir
λ©μλλ‘ ν¨μ κ°μ²΄μ νλ‘νΌν°λ₯Ό λ³Ό μ μλ€.
function square(number) {
return number * number
}
console.dir(square);
square ν¨μμ λͺ¨λ νλ‘νΌν°μ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈλ₯Ό
Object.getOwnPropertyDescriptors
λ©μλλ‘ νμΈν μ μλ€.
function square(number) {
return number * number
}
console.log(Object.getOwnPropertyDescriptors(square));
__proto__
λ square ν¨μμ νλ‘νΌν°κ° μλλ€.__proto__
λObject.prototype
κ°μ²΄μ μ κ·Όμ νλ‘νΌν°λ€.
console.log(Object.getOwnPropertyDescriptor(square, '__proto__'));
// undefined
// square ν¨μλ Object.prototype κ°μ²΄λ‘λΆν° __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό μμλ°λλ€.
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
arguments
call
length
name
prototype
νλ‘νΌν°λ λͺ¨λ ν¨μ κ°μ²΄μλ°μ΄ν° νλ‘νΌ
λ€. μ΄ νλ‘νΌν°λ μΌλ° κ°μ²΄μλ μλ ν¨μ κ°μ²΄ κ³ μ μ νλ‘νΌν°
__proto__
λ μ κ·Όμ νλ‘νΌν°μ΄λ©°, ν¨μ κ°μ²΄ κ³ μ μ νλ‘νΌν°κ° μλλΌObject.prototype
κ°μ²΄μ νλ‘νΌν°λ₯Ό μμλ°μ κ²μ μ μ μλ€.
ν¨μ κ°μ²΄μ
arguments
νλ‘νΌν° κ°μarguments
κ°μ²΄λ€.arguments
κ°μ²΄λ ν¨μ νΈμΆμ μ λ¬λ μΈμλ€μ μ 보λ₯Ό λ΄κ³ μλ μν κ°λ₯νμ μ¬ λ°°μ΄ κ°μ²΄
μ΄λ©°, ν¨μ λ΄λΆμμ μ§μ λ³μμ²λΌ μ¬μ©λλ€. μ¦, ν¨μ μΈλΆμμλ μ°Έμ‘°ν μ μλ€.
ν¨μλ₯Ό μ μν λ μ μΈν맀κ°λ³μ
λ ν¨μ λͺΈμ²΄ λ΄λΆμμ λ³μμ λμΌνκ² μ·¨κΈ. μ¦, ν¨μκ° νΈμΆλλ©΄ ν¨μ λͺΈμ²΄ λ΄μμ μ묡μ μΌλ‘맀κ°λ³μ
κ° μ μΈλκ³undefined
λ‘ μ΄κΈ°νλ μ΄ν μΈμ ν λΉ.
π‘ arguments κ°μ²΄μ Symbol(Symbol.iterator)νλ‘νΌν°
arguments κ°μ²΄
λ₯Ό μν κ°λ₯ν μλ£κ΅¬μ‘°μΈμ΄ν°λ¬λΈ
λ‘ λ§λ€κΈ° μν νλ‘νΌν°λ€.Symbol.iterator
λ₯Ό νλ‘νΌν° ν€λ‘ μ¬μ©ν λ©μλλ₯Ό ꡬννλ κ²μ μν΄μ΄ν°λ¬λΈ
μ΄ λλ€.
function mulitply(x,y) {
// μ΄ν°λ μ΄ν°
const iterator = arguments[Symbol.iterator]();
// μ΄ν°λ μ΄ν°μ next λ©μλλ₯Ό νΈμΆνμ¬ μ΄ν°λ¬λΈ κ°μ²΄ arguments λ₯Ό μν
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: undefined, done: true}
return x * y;
}
multiply(1,2,3);
β arguments κ°μ²΄λ 맀κ°λ³μ κ°μλ₯Ό νμ ν μ μλ κ°λ³ μΈμ ν¨μ
λ₯Ό ꡬνν λ μ μ©νλ€.
function sum() {
let sum = 0;
for(let i = 0; i < arguments.length; i++){
res += arguments[i];
}
return res;
}
console.log(sum()); // 0
console.log(sum(1,2)); // 3
console.log(sum(1,2,3)); // 6
arguments κ°μ²΄
λ λ°°μ΄ ννλ‘ μΈμ μ 보λ₯Ό λ΄κ³ μμ§λ§ μ€μ λ°°μ΄μ΄ μλμ μ¬ λ°°μ΄ κ°μ²΄λ€
π‘ μ μ¬ λ°°μ΄ κ°μ²΄μ μ΄ν°λ¬λΈ
ES6μμ λμ λ μ΄ν°λ μ΄μ νλ‘ν μ½μ μ€μνλ©΄ μν κ°λ₯ν μλ£κ΅¬μ‘°μΈ
μ΄ν°λ¬λΈ
μ΄ λλ€. ES5μμarguments κ°μ²΄
λμ μ¬ λ°°μ΄ κ°μ²΄
λ‘ κ΅¬λΆλμμ§λ§ μ΄ν°λ¬λΈμ΄ λμ λ ES6λΆν°arguments κ°μ²΄
λμ μ¬ λ°°μ΄ κ°μ²΄
μ΄λ©΄μ λμμμ΄ν°λ¬λΈ
μ΄ λλ€.
π‘ Rest νλΌλ―Έν°
μ μ¬ λ°°μ΄ κ°μ²΄
λ λ°°μ΄μ΄ μλλ―λ‘ λ°°μ΄ λ©μλλ₯Ό μ¬μ©ν κ²½μ° μλ¬κ° λ°μ. λ°λΌμ λ°°μ΄ λ©μλλ₯Ό μ¬μ©νλ €λ©΄Function.prototype.call
Function.prototype.apply
λ₯Ό μ¬μ©ν΄ κ°μ νΈμΆν΄μΌνλ λ²κ±°λ‘μμ΄ μλ€.
μ΄λ¬ν λ²κ±°λ‘μμ ν΄κ²°νκΈ° μν΄ ES6μμλRest νλΌλ―Έν°
λ₯Ό λμ νλ€.
function sum() {
// arguments κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ³ν
const array = Array.prototype.slice.call(arguments);
return array.reduce(function (pre, cur) {
return pre + cur;
}, 0);
}
console.log(sum(1,2)) // 3
console.log(sum(1,2,3,4,5)); // 15
function sum(...args) {
return args.reduce((pre,cur) => pre + cur, 0);
}
console.log(sum(1,2)); // 3
console.log(sum(1,2,3,4,5)); // 15;
caller νλ‘νΌν°
λ ECMAScript μ¬μμ ν¬ν¨λμ§ μμ λΉνμ€ νλ‘νΌν° μ΄ν νμ€νλ μμ λ μλ νλ‘νΌν°μ΄λ―λ‘ μ°Έκ³ μ λ.
ν¨μ κ°μ²΄μcaller νλ‘νΌν°
λ ν¨μ μμ μ νΈμΆν ν¨μλ₯Ό κ°λ¦¬ν¨λ€.
function foo(func) {
return func();
}
function bar() {
return 'caller : ' + bar.caller;
}
// λΈλΌμ°μ μμ μ€νν κ²°κ³Ό
console.log(foo(bar)); // caller: function foo(func) {...}
console.log(bar()); // caller: null
ν¨μ κ°μ²΄μ
length νλ‘νΌν°
λ ν¨μλ₯Ό μ μν λ μ μΈν 맀κ°λ³μμ κ°μλ₯Ό κ°λ¦¬ν¨λ€.
function foo() {}
console.log(foo.length); // 0
function bar(x) {
return x;
}
console.log(bar.length); // 1
function baz(x, y) {
return x * y;
}
console.log(baz.length)
arguments κ°μ²΄
μlength νλ‘νΌν°
μν¨μ κ°μ²΄
μlength νλ‘νΌν°
μ κ°μ λ€λ₯Ό μ μμΌλ―λ‘ μ£Όμ
arguments κ°μ²΄μ length νλ‘νΌν°λ μΈμμ κ°μλ₯Ό κ°λ¦¬ν€κ³ , ν¨μμ κ°μ²΄μ length νλ‘νΌν°λ 맀κ°λ³μμ κ°μλ₯Ό κ°λ¦¬ν¨λ€.
ν¨μ κ°μ²΄μ name νλ‘νΌν°λ ν¨μμ΄λ¦μ λνλΈλ€. name νλ‘νΌν°λ ES6 μ΄μ κΉμ§λ λΉνμ€μ΄μλ€κ° ES6μμ μ μ νμ€μ΄ λμλ€.
name νλ‘νΌν°λ ES5μ ES6μμ λμμ λ¬λ¦¬νλ―λ‘ μ€μ μ΅λͺ ν¨μ ννμμ κ²½μ° ES5μμ name νλ‘νΌν°λ λΉ λ¬Έμμ΄ κ°μΌλ‘ κ°κ³ ES6μμλ ν¨μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ μλ³μλ₯Ό κ°μΌλ‘ κ°λλ€.
// κΈ°λͺ
ν¨μ ννμ
var namedFunc = function foo() {};
console.log(namedFunc.name); // foo
// μ΅λͺ
ν¨μ ννμ
var annoymousFunc = function() {};
// ES5: name νλ‘νΌν°λ λΉ λ¬Έμμ΄μ κ°μΌλ‘ κ°λλ€.
// ES6: name νλ‘νΌν°λ ν¨μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ³μ μ΄λ¦μ κ°μΌλ‘ κ°λλ€.
console.log(annoymousFunc.name); // annoymousFunc
// ν¨μ μ μΈλ¬Έ(Function declaration)
function bar() {}
console.log(bar.name_; // bar
λͺ¨λ κ°μ²΄λ
[[Prototype]]
μ΄λΌλ λ΄λΆ μ¬λ‘―μ κ°λλ€.[[Prototype]]
λ΄λΆ μ¬λ‘―μ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ μμμ ꡬννλνλ‘ν νμ κ°μ²΄
λ₯Ό κ°λ¦¬ν¨λ€.
__proto__
νλ‘νΌν°λ[[Prototype]]
λ΄λΆ μ¬λ‘―μ΄ κ°λ¦¬ν€λ νλ‘ν νμ κ°μ²΄μ μ κ·ΌνκΈ° μν΄ μ¬μ©νλμ κ·Όμ νλ‘νΌν°λ€
.
const obj = { a : 1};
// κ°μ²΄ 리ν°λ΄ λ°©μμΌλ‘ μμ±ν κ°μ²΄μ νλ‘ν νμ
κ°μ²΄λ Object.prototypeμ΄λ€.
console.log(obj.__proto__ === Object.prototype); // true
// κ°μ²΄ 리ν°λ΄ λ°©μμΌλ‘ μμ±ν κ°μ²΄λ νλ‘ν νμ
κ°μ²΄μΈ Object.prototypeμ νλ‘νΌν°λ₯Ό μμλ°λλ€.
// hasOwnProperty λ©μλλ Object.prototypeμ λ©μλλ€.
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('__proto__')); // false
π‘ hasOwnProperty λ©μλ
hasOwnProperty λ©μλ
λ μ΄λ¦μμ μ μ μλ―μ΄ μΈμλ‘ μ λ¬λ°μ νλ‘νΌν° ν€κ° κ°μ²΄ κ³ μ μ νλ‘νΌν° ν€μΈ κ²½μ°μλ§true
λ₯Ό λ°ννκ³ μμλ°λ νλ‘ν νμ μ νλ‘νΌν° ν€μΈ κ²½μ°false
λ₯Ό λ°ν
prototype νλ‘νΌν°
λ μμ±μ ν¨μλ‘ νΈμΆν μ μλ ν¨μ κ°μ²΄, μ¦constructor
λ§μ΄ μμ νλ νλ‘νΌν°λ€. μΌλ° κ°μ²΄μ μμ±μ ν¨μλ‘ νΈμΆν μ μλnon-constructor
μλ prototype νλ‘νΌν° μλ€.
prototype νλ‘νΌν°
λ ν¨μκ° κ°μ²΄λ₯Ό μμ±νλ λμ μμ±μ ν¨μλ‘ νΈμΆλ λ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
// ν¨μ κ°μ²΄λ prototype νλ‘νΌν°λ₯Ό μμ νλ€.
(function () {}).hasOwnProperty('prototype'); //true
// μΌλ° κ°μ²΄λ prototype νλ‘νΌν°λ₯Ό μμ νμ§ μλλ€.
({}).hasOwnProperty('prototype') // fasle