
λκ° μ½λλ‘ κ³΅λΆνλ κ² μ’ λ μ μλΏλ κΈ°λΆμ΄λΌμ,, μ΄λ² κΈ λΆν°λ μ½λ νν ν¬μ€νΈκ° λ κ² κ°λ€..γ γ
// 1. ν¨μλ 무λͺ
μ 리ν°λ΄μ μ μ₯ν μ μλ€.
// 2. ν¨μλ λ³μμ μ μ₯ν μ μλ€.
// runtimeμ ν¨μ 리ν°λ΄μ΄ νκ°λμ΄ ν¨μ κ°μ²΄κ° μμ±λκ³ , λ³μμ ν λΉλλ€.
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
function square(number) {
return number * number;
}
// console.dir : ν¨μ κ°μ²΄μ λ΄λΆλ₯Ό λ€μ¬λ€λ³΄λ λ©μλ
console.dir(square); // [Function: square]
------------------------------------------
// λͺ¨λ propertyμ property attributeλ₯Ό νμΈνλ λ©μλ
console.log(Object.getOwnPropertyDescriptors(square));

function square(number) {
return number * number;
}
// __proto__λ square ν¨μμ νλ‘νΌν°κ° μλλ€.
console.log(Object.getOwnPropertyDescriptor(square, '__proto__')); // undefined
// __proto__λ Object.prototype κ°μ²΄μ μ κ·Όμ νλ‘νΌν°λ€.
// square ν¨μλ Object.prototype κ°μ²΄λ‘λΆν° __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό μμλ°λλ€.
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));

function multiply (x, y) {
console.log(arguments);
return x * y;
}
console.log(multiply());
console.log(multiply(1));
console.log(multiply(1, 2));
console.log(multiply(1, 2, 3));

function multiply (x, y) {
// μ΄ν°λ μ΄ν°
const iterator = arguments[Symbol.iterator]();
// μ΄ν°λ μ΄ν°μ next λ©μλλ₯Ό νΈμΆνμ¬ μ΄ν°λ¬λΈ κ°μ²΄ argumentsλ₯Ό μν
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
return x + y;
}
multiply(1, 2, 3);

JSμμλ μ μΈλ λ§€κ°λ³μμ κ°μμ, ν¨μλ₯Ό νΈμΆν λΌ μ λ¬νλ μΈμμ κ°μλ₯Ό νμΈνμ§ μλλ€.
κ·Έλ°λ° ν¨μκ° νΈμΆλλ©΄, μΈμμ κ°μλ₯Ό νμΈν λ€μ, μ΄μ λ°λΌ ν¨μμ λμμ λ¬λ¦¬ μ μν νμκ° μμμλ μλ€.
μ΄ λ arguments κ°μ²΄κ° μ μ©νκ² μ¬μ©λλ€.
function sum() {
let res = 0;
// arguments κ°μ²΄λ length νλ‘νΌν°κ° μλ μ μ¬ λ°°μ΄ κ°μ²΄.
// forλ¬ΈμΌλ‘ μν κ°λ₯νλ€.
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λ μ΄λκΉμ§λ μ μ¬ λ°°μ΄ κ°μ²΄μ΄λ€.
// λ°°μ΄μ μλλ―λ‘, λ°°μ΄ λ©μλλ₯Ό μ¬μ©νλ©΄ errorκ° λ°μνλ€.
function sum() {
// κ·Έλμ Function.prototype.call, Function.prototype.apply λ₯Ό ν΅ν΄ κ°μ νΈμΆν΄μΌ ν¨
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
// => λ§€λ² κ°μ νΈμΆνκΈ°λ λ무 λ²κ±°λ‘μ!!
// κ·Έλμ ES6 μμλ, Rest νλΌλ―Έν°λ₯Ό λμ
ν¨
function sum(...args) {
return args.reduce((pre, cur)=> pre + cur, 0);
}
console.log(sum(1, 2));
console.log(sum(1, 2, 3, 4, 5));
function foo(func) {
return func();
}
function bar() {
return 'caller : ' + bar.caller;
}
// λΈλΌμ°μ μμμ μ€νν κ²°κ³Ό
console.log(foo(bar));
console.log(bar());

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); // 2
name νλ‘νΌν°λ, ν¨μμ μ΄λ¦μ λνλvar namedFunc = function foo() {};
console.log(namedFunc.name); // foo
var anonymousFunc = function() {};
console.log(anonymousFunc.name); // anonymousFunc
function bar() {}
console.log(bar.name); // bar
__proto__ νλ‘νΌν°__proto__ : μ κ·Όμ νλ‘νΌν°const obj = { a: 1 };
// Object.prototype : κ°μ²΄ 리ν°λ΄ λ°©μμΌλ‘ μμ±ν κ°μ²΄μ νλ‘ν νμ
κ°μ²΄
console.log(obj.__proto__ === Object.prototype);
// κ°μ²΄ 리ν°λ΄ λ°©μμΌλ‘ μμ±ν κ°μ²΄λ νλ‘ν νμ
κ°μ²΄μΈ Object.prototypeμ νλ‘νΌν°λ₯Ό μμλ°μ
// hasOwnProperty λ©μλ : Object.prototypeμ λ©μλ
console.log(obj.hasOwnProperty('a'));
console.log(obj.hasOwnProperty('__proto__'));

protytype νλ‘νΌν°κ° μμ
νμ€ν μ½λλ₯Ό μ§μ μμΌλ‘ μ³λ³΄λκΉ, 'μ€ κ·Έλ¬λ€' μ λμ μ΄ν΄λΌλ κ°λ₯ν κ² κ°λ€.
μμΌλ‘λ μ΄λ κ² κ³΅λΆλ₯Ό ν΄λ΄μΌκ² λ€..!