Chapter 4: The Bigger Picture - hochan222/Everything-in-JavaScript GitHub Wiki
λ³μλ₯Ό λ²μ λ¨μ (ν¨μ, λΈλ‘)λ‘ κ΅¬μ±νλ κ²μ λͺ¨λ μΈμ΄μ κ°μ₯ κΈ°λ³Έμ μΈ νΉμ± μ€ νλμ λλ€. Scope λ¨μ λ²μμ κ·Έ μμμμ λ³μ μ μλ μ»΄νμΌ λ λ κ²°μ λ©λλ€. λ²μλ μλ‘ λ΄λΆμ μ€μ²©λλ©° μ£Όμ΄μ§ ννμ λλ λͺ λ Ήλ¬Έμ λν΄ ν΄λΉ λ²μμ κ°μ μ€μ²© μμ€μ΄λ μμ(μΈλΆ) λ²μμμλ λ³μλ§ μ κ·Ό ν μ μμ΅λλ€. νμ(λ΄λΆ) λ²μμ λ³μλ μ¨κ²¨μ§κ³ μ κ·Ό ν μ μμ΅λλ€. μ΄λ° κ²λ€μ 'lexical scope'λΌκ³ ν©λλ€.
JSλ 'lexical scope'μ΄μ§λ§, λ§μ μ¬λλ€μ λ€μ λκ°μ§ νΉμ±λλ¬Έμ μλλΌκ³ μ£Όμ₯ν©λλ€.
- λ²μμ λͺ¨λ μμΉμμ μ μΈ λ λͺ¨λ λ³μκ° λ²μμ μμ λΆλΆμ μ μΈ λ κ²μ²λΌ μ²λ¦¬λλ 'νΈμ΄μ€ν 'μ λλ€.
- varλ‘ μ μΈλ λ³μκ° λΈλ‘ μμ μλλΌλ ν¨μ λ²μλ‘ μ·¨κΈλ©λλ€.
νμ§λ§ μ΄ λκ°μ§λ‘ μ£Όμ₯νκΈ°μλ μΆ©λΆνμ§ μμ΅λλ€.
letμ΄λ constλ₯Ό μ μν λ λ°μνλ TDZ(Temporal Dead Zone)λ₯Ό μμ보면, κ·Έκ²μ μΈμ΄μ νΉμ±μ΄λ©° lexical scopingλ₯Ό 무ν¨ννμ§ μμ΅λλ€. λν, Closuresλ μμ΅λλ€.
TDZμ λͺ¨λ₯Έ μ± μλ°μ€ν¬λ¦½νΈ λ³μλ₯Ό μ¬μ©νμ§ λ§λΌ
TDZ μ맨ν±μ μ μΈ μ μ λ³μμ μ κ·Όνλ κ²μ κΈμ§νλ€. TDZλ μ§κ³λ₯Ό λ΄λ¦°λ€: λ³μ μ μΈ μ μ μ΄λ€ κ²λ μ¬μ©νμ§ μλλ€. var, function μ μΈμ TDZμ μν₯μ λ°μ§ μλλ€. μ΄κ²λ€μ νμ¬ μ€μ½νμμ νΈμ΄μ€ν λλ€.
JSλ class μμμ ꡬ쑰λ₯Ό λ¨Όμ μ μνμ§ μλλΌλ κ°μ²΄λ₯Ό μ§μ μ μ΄κ³ λͺ μμ μΌλ‘ μμ±ν μ μλ λͺ μλλ μΈμ΄μ λλ€.
JavaScript: Object Modelling with Behavior Delegation
JavaScriptμ Prototype λ©μ»€λμ¦μ λ€λ₯Έ κ°μ²΄ Prototypeλ₯Ό μ°Έμ‘°νλ νλμ κ°μ²΄μ μ‘΄μ¬νλ λ΄λΆ λ§ν¬λΌλ κ²μ λλ€. μ ν΅μ μΈ κ°μ²΄ μ§ν₯ μΈμ΄μμ ν΄λμ€λ₯Ό μΈμ€ν΄μ€ν (λλ μμ)νλ νλ‘μΈμ€ λ μ μ λ λμμ ν΄λΉ ν΄λμ€μμ 물리μ κ°μ²΄λ‘ λ³΅μ¬ νμ¬ κ°κ°μ μ μΈμ€ν΄μ€λ₯Ό λ§λλ λ©μ»€λμ¦μ μ€νν©λλ€. νμ§λ§ JSλ 곡ν΅μ κ°μ²΄μ λν λ§ν¬λ₯Ό λκΈΈ λΏμ λλ€.
JSμμ newλ ν¨μκ° μμ±μμ΄κ³ μ΄λ¦μ΄ classμ μ΄λ¦μ μλ―Ένμ§ μμ΅λλ€. newλ₯Ό ν¨μμ μ°λ©΄ ν¨μλ μμ±μκ° μλ κ·Έλ₯ μΌλ° ν¨μμ΄κ³ ν΄λμ€μμ μΈμ€ν΄μ€λ‘ 볡μ¬λλ κ³Όμ μ΄ μμ΅λλ€. μ€μ§ Prototype λ§ λ€λ₯Έ κ°μ²΄μ μμν μ μμ΅λλ€.
λ€λ₯Έ κ°μ²΄μ μ°κ²°λ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν λ new User()
μ μμμ λ°©λ² λ§κ³ Object.create(..)
μ λͺ
μμ λ°©λ²μ΄μλ€.
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 μμλ³΄λ€ λ κ°λ ₯νλ€κ³ μκ°ν©λλ€.
TypeScript/Flowμ μ μ μΈμ΄λ₯Ό μ¬μ©νλ€κ³ ν΄μ νν κ°κ³Όνλ λ¨μμ΄μ§λ§ μ΄κ²λ€μ μ λλ‘ μμ§ λͺ»νλ©΄ νμ λΆμμ νκ² JSμ λν΄ νλ€λ¦΄ μ μλ€. (λ·λΆλΆ Types & Grammarμμ λ€λ£¨μ)