-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
258 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,258 @@ | ||
# βοΈ ν¨μ | ||
|
||
### βοΈ ν¨μμ μ μ | ||
|
||
- ν¨μλ μμ μ μννκ±°λ κ°μ κ³μ°νλ κ³Όμ μ νννκ³ , μ΄λ₯Ό νλμ "λΈλ‘" μΌλ‘ κ°μΈ μ€ν λ¨μλ‘ λ§λ κ²μ΄λ€. | ||
|
||
### βοΈ ν¨μμ μ μ λ°©μ | ||
|
||
1. ν¨μ μ μΈλ¬Έ : `function` ν€μλλ₯Ό μ¬μ©νμ¬ ν¨μλ₯Ό μ μνλ€. | ||
2. ν¨μ ννμ : `function` ν€μλλ₯Ό μ¬μ©νμ¬ μ μν ν¨μλ₯Ό μλ³μμ ν λΉνλ€. | ||
|
||
```js | ||
// ν¨μ μ μΈλ¬Έ | ||
function add(a, b) { | ||
return a + b; | ||
} | ||
|
||
// ν¨μ ννμ | ||
const add = function (a, b) { | ||
return a + b; | ||
}; | ||
``` | ||
|
||
- λ νν λͺ¨λ ν¨μλ₯Ό μ μνλλ° μ°μ΄μ§λ§, κ°μ₯ ν° μ°¨μ΄λ hoisting μ μ¬λΆμ΄λ€. | ||
- ν¨μ μ μΈλ¬Έμ κ²½μ° μ½λ μ€ν μ μ ν΄λΉ ν¨μμ μ λ³΄κ° μ¬μ μ λ©λͺ¨λ¦¬μ λ±λ‘λκΈ° λλ¬Έμ λμΌν λ 벨μ 컨ν μ€νΈ λ΄λΆμμλ μ΄λμλ μ¬μ©μ΄ κ°λ₯νλ€. | ||
- νμ§λ§ ν¨μ ννμμ μμ±λ ν¨μλ₯Ό λ³μμ ν λΉνμκ³ , λ³μμ κ²½μ° κ°μ΄ ν λΉλκΈ° μ΄μ μ μ¬μ©λ κ²½μ° var λ `undefined` λ₯Ό, const μ let μ `ReferenceError` λ₯Ό μ λ°μν¨λ€. | ||
|
||
3. Function μμ±μ : `new Function()` μμ±μλ₯Ό κΈ°λ°μΌλ‘ ν¨μλ₯Ό μμ±νλ λ°©μ | ||
4. Arrow Function : `=>` ν€μλλ₯Ό μ¬μ©ν μ΅λͺ ν¨μλ₯Ό μμ±νκ³ μ΄λ₯Ό λ³μμ ν λΉνλ λ°©μ. | ||
|
||
```js | ||
// Function μμ±μ | ||
const add = new Function("a", "b", "return a + b"); | ||
|
||
const subFuncBody = "return a - b"; | ||
const sub = new Function("a", "b", subFuncBody); // λ°νμ νκ²½μμ Body λ₯Ό ν λΉλ°μ μ€νμ΄ κ°λ₯νλ€. | ||
|
||
// Arrow Function | ||
const add = (a, b) => a + b; | ||
``` | ||
|
||
- Function μμ±μμ κ²½μ° κ°μ₯ λ§μ§λ§ μΈμλ‘ μ€νν ν¨μ λ³Έλ¬Έμ λ°κ³ , μ΄μ μΈμλ€μ λͺ¨λ 맀κ°λ³μλ‘ λ°λλ€. | ||
- Function μμ±μμ κ°μ₯ ν° νΉμ΄μ μ λ°νμ νκ²½μμ μΈκ³ λ°μ λ¬Έμμ΄μ μ¬μ©νμ¬ ν¨μλ₯Ό λ§λ€ μ μλ€λ μ μ΄λ€. (μ½λ μ€ν μ μ΄ μλλΌ, λ°νμ νκ²½μ΄λΌλ κ² μ€μνλ€) | ||
- Arrow Function μ κ²½μ° ν¨μ ννμκ³Ό μ μΈλ¬Έ λ°©μμΌλ‘ μμ±λ ν¨μμλ λ¬λ¦¬ `arguments` κ° μμΌλ©° μμ±μ κΈ°λ°μΌλ‘ μ μμ΄ λΆκ°λ₯νλ€. | ||
- λν this λ°μΈλ©μ΄ νΉμ΄νλ°, νμ΄ν ν¨μλ ν¨μ μ체μ λ°μΈλ©μ κ°μ§μ§ μκΈ° λλ¬Έμ μμ μ νΈμΆν μ€μ½νλ₯Ό κΈ°μ€μΌλ‘ μμ μ€μ½νλ₯Ό κ°λ¦¬ν¨λ€. | ||
|
||
### βοΈ κ·Έ μΈ μμ£Ό μ°μ΄λ ν¨μ μ¬μ© ν¨ν΄ | ||
|
||
1. IIFE (μ¦μ μ€ν ν¨μ) : ν¨μλ₯Ό μ μνλ μκ° μ€νλλ ν¨μ | ||
2. HOC (κ³ μ°¨ ν¨μ) : ν¨μλ₯Ό μΈμλ‘ λ°κ±°λ μλ‘μ΄ ν¨μλ₯Ό λ°ννλ ν¨μ | ||
|
||
```js | ||
// IIFE | ||
async (() => { | ||
const slackClient = await slackApp.bootstrap(); | ||
slackClient.init(); | ||
}) | ||
|
||
// HOC | ||
const Component = () => (<div> {...} </div>) | ||
const intlComponent = withIntl(Component); | ||
``` | ||
|
||
- IIFE μ κ²½μ° ν¨μκ° μ μλλ μ¦μ μ€νλκΈ°μ 1νμ±μΌλ‘ λμνλ€. λ°λΌμ μ¬μ¬μ©μ΄ λΆκ°λ₯νλ€. | ||
- HOC μ κ²½μ° ν¨μν μ»΄ν¬λνΈ λν ν¨μμ΄κΈ° λλ¬Έμ νΉμ μ»΄ν¬λνΈλ₯Ό μΈμλ‘ λ°μ λ‘μ§μ λΆμ°©μμΌ λ°ννλ μ©λλ‘ λ§μ΄ μ°μΈλ€. | ||
|
||
|
||
### βοΈ ν¨μ μ μ μ μ£Όμ μ¬ν | ||
|
||
1. ν¨μμ λΆμ ν¨κ³Όλ₯Ό μ΅λν μ΅μ νλΌ | ||
|
||
- ν¨μμ λΆμν¨κ³Όλ ν¨μ λ΄λΆμ μλμΌλ‘ ν¨μ μΈλΆμ μν₯μ λΌμΉλ νμμ μλ―Ένλ€. | ||
- ν¨μλ κΈ°λ³Έμ μΌλ‘ λμΌν μΈμλ₯Ό λ°μΌλ©΄ νμ λμΌν κ²°κ³Όλ₯Ό λ°νν΄μΌ νλ©°, ν¨μμ μ€νμ΄ μΈλΆμ μν₯μ λ―Έμ³μλ μλλ€. | ||
- λ¬Όλ‘ λΆμ ν¨κ³Όκ° μμ μλ μν©μ μμΌλ μ½λλ₯Ό λ μ½κ² μ΄ν΄νλλ‘ νλ©° λλ²κΉ μ μ©μ΄νκ² νλ μμ ν¨μλ₯Ό μ±μ©νλ € λ Έλ ₯ν΄μΌ νλ€. | ||
|
||
|
||
2. ν¨μλ₯Ό μκ² λ§λ€μ΄λΌ. | ||
|
||
- νλμ ν¨μμ μ¬λ¬ λμμ λ£μ§ λ§κ³ μ΅λν λ¨μΌ κΈ°λ₯μ νλλ‘ ν¨μλ₯Ό μ€κ³νμ. | ||
- ν¨μμ μ¬λ¬ κΈ°λ₯μ΄ μΆκ°λλ©΄ κ° κΈ°λ₯λ€μ΄ λμνλ κ³Όμ μμ μμμΉ λͺ»ν μλ¬λ₯Ό λ§μ΄ν νλ₯ μ΄ μ¬λΌκ°λ€. | ||
|
||
3. ν¨μ λͺ μ λͺ λ£νκ² μ§μ. | ||
|
||
|
||
# βοΈ ν΄λμ€ | ||
|
||
### βοΈ ν΄λμ€λ? | ||
|
||
- μ£Όλ‘ νΉμ ν λͺ©μ μ κ°μ§ κ°μ²΄λ₯Ό λ°λ³΅μ μΌλ‘ μμ±νκΈ° μν΄ μ¬μ©λλ€. | ||
- ES6 μ€νμμ μΆκ°λ λ¬Έλ²μ΄λ©°, μ΄μ λ²μ μ κ²½μ° μ£Όλ‘ prototype κΈ°λ°μ κ°μ²΄ λͺ¨λΈλ§μ μ§ννλ€. (κ°μ κ°μ²΄λ₯Ό λ°ννλ ν¨μ ν¬ν¨) | ||
|
||
### βοΈ constructor | ||
|
||
- κ°μ²΄ (ν΄λμ€ μΈμ€ν΄μ€) λ₯Ό μμ±νκΈ° μν΄ μ¬μ©λλ νΉμ λ©μλλ€. | ||
|
||
### βοΈ property | ||
|
||
- ν΄λμ€ λ΄λΆμμ μ μν μ μλ μμ± κ°μ μλ―Ένλ€. | ||
- Typescript μ κ²½μ° protected, private μ κ°μ΄ μμ± μ κ·Ό μ νμλ₯Ό μ¬μ©ν μ μκ³ , JS μμλ `#` μ μ¬μ©νμ¬ νΉμ μμ±μ private νκ² μ§μ ν μ μλ€. | ||
|
||
### βοΈ getter, setter | ||
|
||
- ν΄λμ€ λ΄λΆμμ νΉμ ν κ°μ κ°μ Έμ¬ λ μ°μ΄λ ν¨ν΄μ΄λ€. | ||
- getter ν¨μμ κ²½μ° μμ `get` μ, setter ν¨μμ κ²½μ° `set` μ λΆμΈλ€. | ||
|
||
### βοΈ μΈμ€ν΄μ€ λ©μλ | ||
|
||
- ν΄λμ€ λ΄λΆμμ μ μΈν λ©μλλ₯Ό μΈμ€ν΄μ€ λ©μλλΌκ³ νλ€. | ||
- μΈμ€ν΄μ€ λ©μλμ κ²½μ° μ½λ μμΌλ‘λ Class λ΄λΆμ μ μλλ, λ°νμ νκ²½μμλ prototype μ μ μΈλμ΄ prototype λ©μλλΌκ³ λΆλ¦°λ€. | ||
- JS λ κΈ°λ³Έμ μΌλ‘ νλ‘ν νμ μΈμ΄μ΄κΈ° λλ¬Έμ, κ°μ²΄ λ΄λΆμ λ©μλλ μμ±λ€μ΄ μ λΆ prototype μ κΈ°λ°μΌλ‘ μ μλ κ²μ λ³Ό μ μλ€. | ||
|
||
|
||
```js | ||
class Car { | ||
constructor(name) { | ||
this.name = name; | ||
} | ||
|
||
getName() { | ||
return this.name | ||
} | ||
} | ||
|
||
const myCar = new Car('λ μ΄'); | ||
console.log(Object.getPrototypeOf(myCar)) // { constructor: f, getName: Ζ } | ||
|
||
``` | ||
|
||
> Prototype Chaining | ||
- ν΄λΉ λ©μλλ₯Ό κ°μ²΄μμ μ μΈνμ§ μμμΌλ νλ‘ν νμ λ΄λΆμ μ‘΄μ¬νλ λ©μλλ₯Ό μ°Ύμ μ€ννλ λ°©μμ Prototype Chaining μ΄λΌ νλ€. | ||
- λͺ¨λ κ°μ²΄λ Object λ₯Ό μ΅μμ κ°μ²΄λ‘ κ°μ§κΈ° λλ¬Έμ, λ³λμ μ μ μμ΄λ Object λ΄λΆ prototype μ μ μλ λ©μλλ€μ κΈ°λ³Έμ μΌλ‘ μ¬μ©ν μ μλ€. | ||
- `toString()` λ©μλμ κ²½μ°μλ λ³λμ μ μ μμ΄ μ΄λ κ°μ²΄μμλ μ¬μ©ν μ μλ€. | ||
|
||
|
||
### βοΈ static (μ μ ) λ©μλ | ||
|
||
- λ³λμ ν΄λμ€ μΈμ€ν΄μ€ μμ΄λ ν΄λμ€ λͺ μ κΈ°λ°μΌλ‘ νΈμΆν μ μλ λ©μλ | ||
- μ μ λ©μλ λ΄λΆμ this λ ν΄λμ€ μΈμ€ν΄μ€κ° μλ ν΄λμ€ μμ μ κ°λ¦¬ν€κΈ° λλ¬Έμ μ μν΄μΌ νλ€. | ||
|
||
### βοΈ μμ | ||
|
||
- κΈ°μ‘΄μ ν΄λμ€λ₯Ό μμ λ°μ μμ ν΄λμ€μ μ΄λ₯Ό νμ₯μν€λ λ¬Έλ² | ||
- ν΄λμ€λ₯Ό μμλ°μ λμμ λΆλͺ¨ ν΄λμ€μμ μ μλ λ©μλμ ν΄λμ€ μμ±μ λͺ¨λ μ¬μ©ν μ μλ€. | ||
|
||
# βοΈ ν΄λμ€μ ν¨μμ κ΄κ³ | ||
|
||
- ES6 μ΄μ μλ prototype κΈ°λ°μΌλ‘ Class μ μν μ λμ ν΄μκΈ° λλ¬Έμ, Class μ½λλ₯Ό ES5λ‘ νΈλμ€νμΌλ§ ν κ²½μ° μλμ κ°μ΄ λ°νλ μ½λκ° λμ¨λ€. | ||
|
||
```js | ||
'use strict'; | ||
|
||
function _defineProperties(target, props) { | ||
for (var i = 0; i < props.length; i++) { | ||
var descriptor = props[i]; | ||
descriptor.enumerable = descriptor.enumerable || false; | ||
descriptor.configurable = true; | ||
if ('value' in descriptor) descriptor.writable = true; | ||
Object.defineProperty( | ||
target, | ||
_toPropertyKey(descriptor.key), | ||
descriptor, | ||
); | ||
} | ||
} | ||
|
||
function _createClass(Constructor, protoProps, staticProps) { | ||
if (protoProps) _defineProperties(Constructor.prototype, protoProps); | ||
if (staticProps) _defineProperties(Constructor, staticProps); | ||
Object.defineProperty(Constructor, 'prototype', { writable: false }); | ||
return Constructor; | ||
} | ||
|
||
function _toPropertyKey(arg) { | ||
var key = _toPrimitive(arg, 'string'); | ||
return _typeof(key) === 'symbol' ? key : String(key); | ||
} | ||
|
||
function _toPrimitive(input, hint) { | ||
if (_typeof(input) !== 'object' || input === null) return input; | ||
var prim = input[Symbol.toPrimitive]; | ||
if (prim !== undefined) { | ||
var res = prim.call(input, hint || 'default'); | ||
if (_typeof(res) !== 'object') return res; | ||
throw new TypeError('@@toPrimitive must return a primitive value.'); | ||
} | ||
return (hint === 'string' ? String : Number)(input); | ||
} | ||
|
||
function _classCallCheck(instance, Constructor) { | ||
if (!(instance instanceof Constructor)) { | ||
throw new TypeError('Cannot call a class as a function'); | ||
} | ||
} | ||
var Cat = /*#__PURE__*/ _createClass(function Cat(name) { | ||
_classCallCheck(this, Cat); | ||
this.name = name; | ||
}); | ||
``` | ||
|
||
> νΈλμ€νμΌλ§ λ μ½λλ€μ΄ κ°κ° μ΄λ€ μν μ νλμ§ μμ보μ. | ||
1. `_createClass` ν¨μ | ||
|
||
```js | ||
function _createClass(Constructor, protoProps, staticProps) { | ||
if (protoProps) _defineProperties(Constructor.prototype, protoProps); | ||
if (staticProps) _defineProperties(Constructor, staticProps); | ||
Object.defineProperty(Constructor, 'prototype', { writable: false }); | ||
return Constructor; | ||
} | ||
``` | ||
|
||
- `_createClass` ν¨μλ 첫 λ²μ§Έ μΈμλ‘ Constructor (μμ±μ) ν¨μλ₯Ό λ°λλ€. | ||
- μ΄ν protoProps μ staticProps λ₯Ό λ°λλ° κ°κ° μμ±μ νΈμΆλ‘ λ°νλ κ°μ²΄μ prototype νΉμ μμ±μ λ΄λΆμ μλ‘μ΄ μμ±μ μΆκ°νκ³ μΆμ λ μ°μΈλ€. | ||
- Constructor ν¨μμ prototype μμ± μ€ writable flag λ₯Ό false λ‘ μμ ν¨μΌλ‘μ μμ μ΄ λΆκ°νλλ‘ νλ€. (configurable μ true μ΄κΈ°μ μμ ν μμ λΆκ°λ μλλ€) | ||
- μμ μ΄ μλ£λ ν¨μκ° λ°νλκ³ , μ΄ν ν΄λΉ ν¨μλ₯Ό `new` ν€μλλ‘ μμ±μλ₯Ό νΈμΆνμ¬ prototype μ μ μ¬λ λ©μλλ€μ΄ ν¬ν¨λ κ°μ²΄λ₯Ό λ°ννλ€. | ||
|
||
2. `_classCallCheck` ν¨μ | ||
|
||
```js | ||
var Cat = /*#__PURE__*/ _createClass(function Cat(name) { | ||
_classCallCheck(this, Cat); | ||
this.name = name; | ||
}); | ||
|
||
function _classCallCheck(instance, Constructor) { | ||
// λ§μ½ Cat ν¨μκ° new Cat() μ΄ μλ Cat() μΌλ‘ νΈμΆλμλ€λ©΄ μλ¬ λ°μ. | ||
if (!(instance instanceof Constructor)) { | ||
throw new TypeError('Cannot call a class as a function'); | ||
} | ||
} | ||
``` | ||
|
||
- ν¨μλ μΌλ° νΈμΆκ³Ό `new` ν€μλλ₯Ό κΈ°λ°μΌλ‘ ν μμ±μ νΈμΆλ‘ λλλλ°, μ¬κΈ°μλ μμ±μλ₯Ό νΈμΆν΄μΌ νλ―λ‘ μ΄λ₯Ό κ²μ¬νκΈ° μν΄ μΆκ°λ ν¨μλ€. | ||
- μΌλ°μ μΌλ‘ ν¨μλ₯Ό κ·Έλ₯ μ€νν κ²½μ° this λ°μΈλ©μ΄ μ μ κ°μ²΄λ‘ μ΄μ΄μ§κΈ° λλ¬Έμ, `instance instanceof Constructor` 쑰건문μ ν΅κ³Όν μ μλ€. | ||
|
||
3. `_defineProperties` ν¨μ | ||
|
||
```js | ||
function _defineProperties(target, props) { | ||
for (var i = 0; i < props.length; i++) { | ||
var descriptor = props[i]; | ||
descriptor.enumerable = descriptor.enumerable || false; | ||
descriptor.configurable = true; | ||
if ('value' in descriptor) descriptor.writable = true; | ||
Object.defineProperty( | ||
target, | ||
_toPropertyKey(descriptor.key), | ||
descriptor, | ||
); | ||
} | ||
} | ||
``` | ||
|
||
- ES5 μ€νμ `Object.defineProperties` ν¨μλ₯Ό λνν ν¨μλ€. | ||
- `value` κ° μ‘΄μ¬νλ property μΈ κ²½μ° μμ μ΄ κ°λ₯νλλ‘ writable flag λ₯Ό true λ‘ μ€μ νλ€. | ||
- configurable flag λ true μ΄λ©°, enumerable flag μ κ²½μ° property μ μ μλ κ°μ λ°λΌκ°λ€. (default λ false) |