Chapter 4: The Bigger Picture - hochan222/Everything-in-JavaScript GitHub Wiki

Pillar 1: Scope and Closure

λ³€μˆ˜λ₯Ό λ²”μœ„ λ‹¨μœ„ (ν•¨μˆ˜, 블둝)둜 κ΅¬μ„±ν•˜λŠ” 것은 λͺ¨λ“  μ–Έμ–΄μ˜ κ°€μž₯ 기본적인 νŠΉμ„± 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. Scope λ‹¨μœ„ λ²”μœ„μ™€ κ·Έ μ•ˆμ—μ„œμ˜ λ³€μˆ˜ μ •μ˜λŠ” 컴파일 될 λ•Œ κ²°μ •λ©λ‹ˆλ‹€. λ²”μœ„λŠ” μ„œλ‘œ 내뢀에 μ€‘μ²©λ˜λ©° 주어진 ν‘œν˜„μ‹ λ˜λŠ” λͺ…령문에 λŒ€ν•΄ ν•΄λ‹Ή λ²”μœ„μ˜ 같은 쀑첩 μˆ˜μ€€μ΄λ‚˜ μƒμœ„(μ™ΈλΆ€) λ²”μœ„μ—μžˆλŠ” λ³€μˆ˜λ§Œ μ ‘κ·Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μœ„(λ‚΄λΆ€) λ²”μœ„μ˜ λ³€μˆ˜λŠ” μˆ¨κ²¨μ§€κ³  μ ‘κ·Ό ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이런 것듀을 'lexical scope'라고 ν•©λ‹ˆλ‹€.

JSλŠ” 'lexical scope'μ΄μ§€λ§Œ, λ§Žμ€ μ‚¬λžŒλ“€μ€ λ‹€μŒ 두가지 νŠΉμ„±λ•Œλ¬Έμ— μ•„λ‹ˆλΌκ³  μ£Όμž₯ν•©λ‹ˆλ‹€.

  1. λ²”μœ„μ˜ λͺ¨λ“  μœ„μΉ˜μ—μ„œ μ„ μ–Έ 된 λͺ¨λ“  λ³€μˆ˜κ°€ λ²”μœ„μ˜ μ‹œμž‘ 뢀뢄에 μ„ μ–Έ 된 κ²ƒμ²˜λŸΌ μ²˜λ¦¬λ˜λŠ” 'ν˜Έμ΄μŠ€νŒ…'μž…λ‹ˆλ‹€.
  2. var둜 μ„ μ–Έλœ λ³€μˆ˜κ°€ 블둝 μ•ˆμ— μžˆλ”λΌλ„ ν•¨μˆ˜ λ²”μœ„λ‘œ μ·¨κΈ‰λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 이 λ‘κ°€μ§€λ‘œ μ£Όμž₯ν•˜κΈ°μ—λŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

letμ΄λ‚˜ constλ₯Ό μ •μ˜ν•  λ•Œ λ°œμƒν•˜λŠ” TDZ(Temporal Dead Zone)λ₯Ό μ•Œμ•„λ³΄λ©΄, 그것은 언어적 νŠΉμ„±μ΄λ©° lexical scopingλ₯Ό λ¬΄νš¨ν™”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ˜ν•œ, Closures도 μžˆμŠ΅λ‹ˆλ‹€.

TDZ을 λͺ¨λ₯Έ 채 μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ 말라

TDZ μ‹œλ§¨ν‹±μ€ μ„ μ–Έ 전에 λ³€μˆ˜μ— μ ‘κ·Όν•˜λŠ” 것을 κΈˆμ§€ν•œλ‹€. TDZλŠ” 징계λ₯Ό λ‚΄λ¦°λ‹€: λ³€μˆ˜ μ„ μ–Έ 전에 μ–΄λ–€ 것도 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. var, function 선언은 TDZ에 영ν–₯을 받지 μ•ŠλŠ”λ‹€. 이것듀은 ν˜„μž¬ μŠ€μ½”ν”„μ—μ„œ ν˜Έμ΄μŠ€νŒ… λœλ‹€.

Pillar 2: Prototypes

JSλŠ” class μ•ˆμ—μ„œ ꡬ쑰λ₯Ό λ¨Όμ € μ •μ˜ν•˜μ§€ μ•Šλ”λΌλ„ 객체λ₯Ό 직접적이고 λͺ…μ‹œμ μœΌλ‘œ 생성할 수 μžˆλŠ” λͺ‡ μ•ˆλ˜λŠ” μ–Έμ–΄μž…λ‹ˆλ‹€.

JavaScript: Object Modelling with Behavior Delegation

JavaScript의 Prototype λ©”μ»€λ‹ˆμ¦˜μ€ λ‹€λ₯Έ 객체 Prototypeλ₯Ό μ°Έμ‘°ν•˜λŠ” ν•˜λ‚˜μ˜ 객체에 μ‘΄μž¬ν•˜λŠ” λ‚΄λΆ€ λ§ν¬λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. 전톡적인 객체 지ν–₯ μ–Έμ–΄μ—μ„œ 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€ν™” (λ˜λŠ” 상속)ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€ λŠ” μ •μ˜ 된 λ™μž‘μ„ ν•΄λ‹Ή ν΄λž˜μŠ€μ—μ„œ 물리적 객체둜 볡사 ν•˜μ—¬ 각각의 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” λ©”μ»€λ‹ˆμ¦˜μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ JSλŠ” κ³΅ν†΅μ˜ 객체에 λŒ€ν•œ 링크λ₯Ό λ„˜κΈΈ λΏμž…λ‹ˆλ‹€.

JSμ—μ„œ newλŠ” ν•¨μˆ˜κ°€ μƒμ„±μžμ΄κ³  이름이 class의 이름을 μ˜λ―Έν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. newλ₯Ό ν•¨μˆ˜μ— μ“°λ©΄ ν•¨μˆ˜λŠ” μƒμ„±μžκ°€ μ•„λ‹Œ κ·Έλƒ₯ 일반 ν•¨μˆ˜μ΄κ³  ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€λ‘œ λ³΅μ‚¬λ˜λŠ” 과정이 μ—†μŠ΅λ‹ˆλ‹€. 였직 Prototype 만 λ‹€λ₯Έ 객체에 μœ„μž„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ 객체에 μ—°κ²°λœ μƒˆλ‘œμš΄ 객체λ₯Ό 생성할 λ•Œ new User() 의 μ•”μ‹œμ  방법 말고 Object.create(..)의 λͺ…μ‹œμ  λ°©λ²•μ΄μžˆλ‹€.

behavior delegation

behavior delegation은 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν”„λ‘œν† νƒ€μž… λ©”μ»€λ‹ˆμ¦˜ 객체 μžμ²΄μ— μ—†λŠ” 경우 일뢀 κ°œμ²΄κ°€ 속성 λ˜λŠ” λ©”μ„œλ“œ 참쑰에 λŒ€ν•œ 일반적인 μœ ν‹Έλ¦¬ν‹° 객체에 λŒ€ν‘œλ‹¨μ„ 제곡 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 전톡적인 객체 지ν–₯ λ””μžμΈ νŒ¨ν„΄κ³ΌλŠ” 맀우 λ‹€λ¦…λ‹ˆλ‹€.

const Widget = {
    init(width,height){
        this.width = width || 50;
        this.height = height || 50;
        this.$elem = null;
    },
    insert($where){
        if (this.$elem) {
            this.$elem.css({
                width: this.width + "px",
                height: this.height + "px"
            }).appendTo($where);
        }
    }
};
const Button = {
    setup(width,height,label){
        // delegated call
        this.init(width, height);
        this.label = label || "Default";
        this.$elem = $("<button>").text(this.label);
    },
    build($where) {
        // delegated call
        this.insert($where);
        this.$elem.click(this.onClick.bind(this));
    },
    onClick(evt) {
        console.log("Button '" + this.label + "' clicked!");
    }
};
Object.setPrototypeOf(Button, Widget);
$(document).ready(function(){
    const $body = $(document.body);
    const btn1 = Object.create(Button);
    btn1.setup(120, 30, "A");
    const btn2 = Object.create(Button);
    btn2.setup(150, 50, "B");
    btn1.build($body);
    btn2.build($body);
} );

이런 behavior delegationκ°€ class 상속보닀 더 κ°•λ ₯ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

Pillar 3: Types and Coercion

TypeScript/Flow의 정적언어λ₯Ό μ‚¬μš©ν•œλ‹€κ³  ν•΄μ„œ ν”νžˆ κ°„κ³Όν•˜λŠ” λ‹¨μ›μ΄μ§€λ§Œ 이것듀을 μ œλŒ€λ‘œ μ•Œμ§€ λͺ»ν•˜λ©΄ 항상 λΆˆμ™„μ „ν•˜κ²Œ JS에 λŒ€ν•΄ 흔듀릴 수 μžˆλ‹€. (λ’·λΆ€λΆ„ Types & Grammarμ—μ„œ λ‹€λ£¨μž)

⚠️ **GitHub.com Fallback** ⚠️