ν°μ€ν 리 λ·°
[JavaScript] ν¨μμ μΌκΈ κ°μ²΄
κ°λ°κ°κ΅΄πΈ 2022. 7. 22. 16:54μΌκΈ κ°μ²΄
μΌκΈ κ°μ²΄λ, λ€μκ³Ό 쑰건μ λ§μ‘±νλ κ°μ²΄μ λλ€.
- 무λͺ μ 리ν°λ΄λ‘ μμ±ν μ μλ€. μ¦, λ°νμμ μμ±μ΄ κ°λ₯νλ€.
- λ³μλ μλ£κ΅¬μ‘°(κ°μ²΄, λ°°μ΄ λ±)μ μ μ₯ν μ μλ€.
- ν¨μμ 맀κ°λ³μμ μ λ¬ν μ μλ€.
- ν¨μμ λ°νκ°μΌλ‘ μ¬μ©ν μ μλ€.
μλ°μ€ν¬λ¦½νΈμ ν¨μλ λ€μ μμ μ κ°μ΄ μμ 쑰건μ 보λ λ§μ‘±νλ―λ‘ μΌκΈ κ°μ²΄μ λλ€.
// 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 functoin () {
num = aux(num);
return num;
};
}
// 3. ν¨μλ 맀κ°λ³μμκ² ν¨μ μ λ¬ κ°λ₯
const increaser = makeCounter(auxs.increase);
console.log(increaser()); // 1
μ΄μ²λΌ ν¨μκ° μΌκΈ κ°μ²΄λΌλ κ²μ ν¨μλ₯Ό κ°μ²΄μ λμΌνκ² μ¬μ©ν μ μλ€λ κ²μ μλ―Ένκ³ , μ΄λ *ν¨μν νλ‘κ·Έλλ°μ κ°λ₯μΌ νλ μλ°μ€ν¬λ¦½νΈμ μ₯μ μ€ νλμ λλ€.
*ν¨μν νλ‘κ·Έλλ° : https://j-su2.tistory.com/35?category=1033772
ν¨μ κ°μ²΄μ νλ‘νΌν°
ν¨μλ κ°μ²΄μ΄λ―λ‘ νλ‘νΌν°λ₯Ό κ°μ§λλ€.
function square(number) {
return number * number;
}
console.dir(square);
squareν¨μμ λͺ¨λ νλ‘νΌν°μ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈλ Objcect.getOwnPropertyDescriptors λ©μλλ‘ νμΈμ΄ κ°λ₯ν©λλ€.
μ΄μ²λΌ arguments, caller, length, name, prototype νλ‘νΌν°λ λͺ¨λ ν¨μ κ°μ²΄μ λ°μ΄ν° νλ‘νΌν°λ‘, μΌλ° κ°μ²΄μλ μλ ν¨μ κ°μ²΄ κ³ μ νλ‘νΌν°μ λλ€.
console.log(Object.getOwnPropertyDescriptor(square, '__proto__')); // undefined
// {get: f, set: f, enumberable: false, configurable: true}
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
νμ§λ§, __proto__λ μ κ·Όμ νλ‘νΌν°μ΄λ©°, ν¨μ κ³ μ κ°μ²΄μ νλ‘νΌν°κ° μλλΌ Object.prototype κ°μ²΄μ μνλ‘νΌν°λ₯Ό μμλ°μ κ²μ μ μ μμ΅λλ€. Object.prototype κ°μ²΄μ νλ‘νΌν°λ λͺ¨λ κ°μ²΄κ° μμλ°μ μ¬μ©ν μ μμ΅λλ€.
arguments νλ‘νΌν°
ν¨μ κ°μ²΄μ arguments νλ‘νΌν° κ°μ arguments κ°μ²΄μ λλ€.
- ν¨μ νΈμΆ μ μ λ¬λ μΈμλ€μ μ 보λ₯Ό λ΄κ³ μλ μν κ°λ₯ν *μ μ¬ λ°°μ΄ κ°μ²΄
- ν¨μ λ΄λΆμμ μ§μ λ³μμ²λΌ μ¬μ©λ¨
- ν¨μ μΈλΆμμλ μ°Έμ‘° X
*μ μ¬ λ°°μ΄ κ°μ²΄ : length νλ‘νΌν°λ₯Ό κ°μ§ κ°μ²΄λ‘ for λ¬ΈμΌλ‘ μνν μ μλ κ°μ²΄
function multiply(x, y) {
console.log(arguments);
return x * y;
}
console.log(multiply(1)); // NaN, arguments = [1];
console.log(multiply(1,2)); // 2, arguments = [1, 2];
console.log(multiply(1,2,3)); // 2, arguments = [1, 2, 3];
λͺ¨λ μΈμλ μ묡μ μΌλ‘ argumtents κ°μ²΄μ νλ‘νΌν°λ‘ 보κ΄λ©λλ€. arguments κ°μ²΄λ μΈμλ₯Ό νλ‘νΌν° κ°μΌλ‘ μμ νλ©° νλ‘νΌν° ν€λ μΈμμ μμλ₯Ό λνλ λλ€.
- callee νλ‘νΌν° : νΈμΆλμ΄ arguments κ°μ²΄λ₯Ό μμ±ν ν¨μ, μ¦ μμ μ κ°λ₯΄ν΄
- length νλ‘νΌν° : μΈμμ κ°μλ₯Ό λνλ
λ°λΌμ 맀κ°λ³μ κ°μλ₯Ό νμ ν μ μλ κ°λ³ μΈμ ν¨μλ₯Ό ꡬνν λ μ μ©ν©λλ€.
μ΄μ ν¨μ κ°μ²΄μ νλ‘νΌν°λ€μ λν΄ μμΈν μμλ³΄κ² μ΅λλ€.
caller νλ‘νΌν°
ν¨μ μμ μ νΈμΆν ν¨μλ₯Ό κ°λ¦¬ν΅λλ€. caller νλ‘νΌν°λ ECMAScript μ¬μμ ν¬ν¨λμ§ μλ λΉνμ€ νλ‘νΌν°μ΄λ―λ‘ μ°Έκ³ λ‘λ§ μμλλ©΄ λ©λλ€.
function foo(func) {
return func();
}
function bar(func) {
return 'caller: ' + bar.caller;
}
// bar ν¨μλ₯Ό foo ν¨μ λ΄μμ νΈμΆ
console.log(foo(bar)); // caller : function foo(bar) { ... }
// bar ν¨μλ₯Ό νΈμΆν ν¨μκ° μμ
console.log(bar()); // caller : null
length νλ‘νΌν°
ν¨μλ₯Ό μ μν λ μ μΈν 맀κ°λ³μμ κ°μλ₯Ό κ°λ₯΄ν΅λλ€.
function bar(x) {
return x;
}
console.log(bar.length); // 1
arguments κ°μ²΄μ length νλ‘νΌν°λ μΈμμ κ°μλ₯Ό κ°λ₯΄ν€κ³ , ν¨μ κ°μ²΄λ 맀κ°λ³μμ κ°μλ₯Ό κ°λ₯΄ν΅λλ€.
name νλ‘νΌν°
ES6μμ μ μ νμ€μ΄ λ νλ‘νΌν°λ‘ ν¨μ μ΄λ¦μ λνλ λλ€.
function bar() {};
console.log(bar.name); // bar
__proto__ μ κ·Όμ νλ‘νΌν°
λͺ¨λ κ°μ²΄λ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ μμμ ꡬννλ νλ‘ν¬νμ κ°μ²΄λ₯Ό κ°λ₯΄ν€λ [[Prototype]] λ΄λΆ μ¬λ‘―μ κ°μ§λλ€.
μ΄λ, __proto__ νλ‘νΌν°λ [[Prototype]] λ΄λΆ μ¬λ‘―μ΄ κ°λ¦¬ν€λ νλ‘ν νμ κ°μ²΄μ μ κ·ΌνκΈ° μν΄ μ¬μ©νλ μ κ·Όμ νλ‘νΌν°μ λλ€.
const obj = { a: 1 };
console.log(obj.__proto__ === Object.prototype); // true
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('__proto__')); // false
μ§μ μ κ·Όν μ μλ [[Prototype]] λ΄λΆ μ¬λ‘―μ __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ νλ‘ν νμ κ°μ²΄μ μ κ·Ό ν μ μμ΅λλ€.
prototype νλ‘νΌν°
μμ±μ ν¨μλ‘ νΈμΆν μ μλ ν¨μ κ°μ²΄, μ¦ constructorλ§μ΄ μμ νλ νλ‘νΌν°μ λλ€. μΌλ° κ°μ±μ μμ±μ ν¨μλ‘ νΈμΆν μ μλ non-constructorμλ prototype νλ‘νΌν°κ° μμ΅λλ€.
(function () {}).hasOwnProperty('prototype'); // true
({}).hasOwnProperty('prototype'); // false
prototype νλ‘νΌν°λ ν¨μκ° κ°μ²΄λ₯Ό μμ±νλ μμ±μ ν¨μλ‘ νΈμΆλ λ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ κ°μ²΄λ₯Ό κ°λ₯΄ν΅λλ€.
[μΆμ²] λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive
'JavaScript > λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JavaScript] strict mode (0) | 2022.07.24 |
---|---|
[JavaScript] νλ‘ν νμ (0) | 2022.07.24 |
[JavaScript] μμ±μ ν¨μμ μν κ°μ²΄ μμ± (0) | 2022.07.22 |
[JavaScript] νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ (0) | 2022.07.21 |
[JavaScript] let, const ν€μλμ λΈλ‘ λ 벨 μ€μ½ν (0) | 2022.07.21 |
- Total
- Today
- Yesterday
- λ°±μ€ node.js
- Baekjoon
- μλ°
- νλ‘κ·Έλλ¨Έμ€
- νλ‘ν μ½
- git
- μκ³ λ¦¬μ¦
- JavaScript
- κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
- map
- ν¨μν νλ‘κ·Έλλ°
- λμμΈ ν¨ν΄
- http
- μ μ λ³μ
- λ°±μ€
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°
- μ½λ©ν μ€νΈ
- λ μ컬 νκ²½
- μ΄μ체μ
- μ΄λΆνμ
- μλ°μ€ν¬λ¦½νΈ
- λͺ¨λ μλ°μ€ν¬λ¦½νΈ deep dive
- λ€νΈμν¬
- μΉ΄μΉ΄μ€ μΈν΄
- 2019 μΉ΄μΉ΄μ€ κ°λ°μ κ²¨μΈ μΈν΄
- ν¬ν¬μΈν°
- λ°±μ€ javascript
- TDD
- νλ‘νΌν°
- fp
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |