
π JavaScript ν¨μ μ¬ν
μλ°μ€ν¬λ¦½νΈμμ ν¨μλ λ¨μν λͺ λ Ήμ΄ λ¬Άμμ΄ μλλΌ μΌκΈ κ°μ²΄λ‘ μ·¨κΈλκΈ° λλ¬Έμ
λ³μμ λ΄κ±°λ, λ€λ₯Έ ν¨μμ μΈμλ‘ μ λ¬νκ±°λ, μ¬μ§μ΄ ν¨μμμ ν¨μλ₯Ό λ°ννλ κ²λ κ°λ₯νλ€.
μ΄λ° νΉμ§ λλΆμ ν¨μλ μλ°μ€ν¬λ¦½νΈμ κ°μ₯ κ°λ ₯ν λꡬ μ€ νλμ΄λ©°
μ΄λ₯Ό κΈ°λ°μΌλ‘ μ½λ°± ν¨μ, κ³ μ°¨ ν¨μ, ν΄λ‘μ , ν¨μν νλ‘κ·Έλλ° ν¨ν΄ λ±μ΄ κ°λ₯ν΄μ§λ€.
μ΄λ² ν¬μ€ν μμλ ν¨μ ννμ(μ΅λͺ λ° κΈ°λͺ ), νμ΄ν ν¨μμ νΉμ§μ μμ μ ν¨κ» μ 리ν΄λ³΄κ³ μ νλ€.
πͺμ§λ ν¬μ€ν 볡μ΅: ν¨μμ νΈμ΄μ€ν
μμ ν¬μ€ν μμ λ€λ€λ ν¨μ μ μΈλ¬Έκ³Ό νΈμ΄μ€ν μ μ κΉ λ³΅μ΅ν΄λ³΄μ.
μλ°μ€ν¬λ¦½νΈμμλ ν¨μ μ μΈλ¬Έμ μ½λ μλμ μ μ΄λ, μ€ν μμ μ μ μμ μΌλ‘ νΈμΆν μ μλ€.
μ΄λ νΈμ΄μ€ν λλΆμΈλ°, ν¨μ μ μΈλ¬Έμ μ½λ μ€ν μ , λ©λͺ¨λ¦¬μ 미리 μ¬λ €μ§κΈ° λλ¬Έμ΄λ€.
(μμΈν λ΄μ©μ μ§λ ν¬μ€ν μ°Έκ³ )
[리μ‘νΈ κΈ°μ΄ μ€ν°λ] JavaScript ν¨μμ νΈμ΄μ€ν
π JavaScript ν¨μμ νΈμ΄μ€ν (Hoisting)μλ°μ€ν¬λ¦½νΈμμ ν¨μλ₯Ό μ μΈνκ³ μ¬μ©νλ λ°©μμ λ€λ₯Έ μΈμ΄μ λΉκ΅νμ λ μ‘°κΈ νΉμ΄νλ€.νΉν νΈμ΄μ€ν (Hoisting)μ΄λΌλ κΈ°λ₯ λλΆμ, ν¨μ μ μΈμ΄ μ½λ
sso-codingdiary.tistory.com
π¨ ν¨μ ννμ: μ΅λͺ vs κΈ°λͺ
λ¨Όμ κΈ°λͺ ν¨μ ννμ(named function expression)λΆν° μ΄ν΄λ³΄λ©΄ μλμ κ°λ€.
let varB = function funcB() {
console.log("funcB");
};
varB(); // "funcB"
// funcB(); // β ReferenceError (λ°κΉ₯ μ€μ½νμμ μ΄λ¦μ λͺ¨λ¦)
μ¬κΈ°μ μ μ μλ―μ΄, ν¨μμ λ΄λΆμ© μ΄λ¦ funcBκ° λΆμ΄ μκΈ΄ νμ§λ§,
λ°κΉ₯ μ€μ½νμμλ κ·Έ μ΄λ¦μΌλ‘ νΈμΆμ ν μκ° μλ€.
(μ€μ§ ν¨μ λ΄λΆμμλ§ funcBλΌλ μ΄λ¦μΌλ‘ μ°Έμ‘°κ° κ°λ₯νλ€.)
λ€μμΌλ‘ μ΅λͺ ν¨μ ννμ(Anonymous Function Expression)μ μλ μμμ κ°μ΄ μ λ§ λ§ κ·Έλλ‘ μ΄λ¦μ‘°μ°¨ μλ ννμ΄λ€.
let anon = function () {
console.log("anonymous");
};
anon();
μλ μ΄λ¦μ΄ μ μ΄μ λΆμ΄μμ§ μκΈ° λλ¬Έμ λ³μλͺ (anon)μΌλ‘λ§ μ κ·Όμ΄ κ°λ₯νλ€.
μ΄λ λλ²κΉ ν λ μ΄λ¦μ΄ μμ΄μ λΆνΈν μλ μκΈ΄ νμ§λ§,
μ½λκ° μ§§μ λλ κ°μ₯ κ°λ¨νκ³ μ§κ΄μ μ΄μ΄μ μμ£Ό μ¬μ©νλ€.
setTimeout(function () {
console.log("1μ΄ ν μ€ν!");
}, 1000);
π₯ νμ΄ν ν¨μ (Arrow Function)
ES6μμ λμ λ νμ΄ν ν¨μλ κΈ°μ‘΄ ν¨μ ννμλ³΄λ€ ν¨μ¬ κ°κ²°ν λ¬Έλ²μ μ 곡νλ€.
let varC = () => 1; // λ§€κ°λ³μ 0κ°, ννμ λ³Έλ¬Έ → λ°ν μλ΅ (μμμ λ°ν)
let varD = (value) => value + 1; // λ§€κ°λ³μ 1κ°, ννμ λ³Έλ¬Έ
let varE = (value) => {
console.log(value);
return value + 1; // λΈλ‘ λ³Έλ¬Έμμλ return νμ
};
console.log(varC()); // 1
π νΉμ§ 1
μ΄λ¬ν νμ΄ν ν¨μμ ν΅μ¬ νΉμ§ μ€ νλλ this λ°μΈλ©μ΄ μλ€λ κ²μ΄λ€.
νμ΄ν ν¨μλ μμ λ§μ thisλ₯Ό λ§λ€μ§ μκ³ , λ°κΉ₯ μ€μ½νμ thisλ₯Ό κ·Έλλ‘ μ¬μ©(lexical this)νλ€.
λλΆμ μ½λ°±μμ thisκ° λ¬λΌμ Έμ ν·κ°λ¦¬λ λ¬Έμ λ₯Ό κΉλνκ² ν΄κ²°ν μ μλ€.
const obj = {
x: 1,
normal: function () { console.log(this.x); },
arrow: () => console.log(this.x),
};
obj.normal(); // 1
obj.arrow(); // undefined
obj.normal( )μ μ€ννλ©΄ thisκ° objλ₯Ό κ°λ¦¬ν€κΈ° λλ¬Έμ
this.xλ obj.xλ₯Ό μλ―Έν΄μ 1μ΄ μΆλ ₯λλ€.
κ·Έλ¬λ arrowλ νμ΄ν ν¨μμ΄κΈ° λλ¬Έμ μκΈ° μμ λ§μ thisλ₯Ό κ°μ§μ§ μκ³ ,
ν¨μκ° μ μΈλ λΉμμ μΈλΆ μ€μ½ν(this)λ₯Ό κ·Έλλ‘ κ°μ Έμ€κ² λλ€.
λ°λΌμ arrow ν¨μμμμ this.xλ obj.xλ₯Ό κ°λ¦¬ν€λκ² μλλΌ, μ μ κ°μ²΄μ xλ₯Ό μ°Ύκ² λκ³ ,
μμ μ½λμμλ ν΄λΉ κ°μ΄ μκΈ° λλ¬Έμ undefinedκ° μΆλ ₯λλ κ²μ΄λ€.
π‘ μΌλ° ν¨μμμλ νΈμΆν 주체(obj)κ° λꡬλμ λ°λΌ thisκ° λ¬λΌμ§λ€.
π‘ νμ΄ν ν¨μμμλ μ μΈλ μμΉμ μΈλΆ thisλ₯Ό μΊ‘μ²ν΄μ μ°κΈ° λλ¬Έμ νΈμΆ 주체μ μκ΄ μμ΄ λ³νμ§ μλλ€.
π νΉμ§ 2
λ λ€λ₯Έ νΉμ§μΌλ‘λ arguments κ° μλ€λ μ μ΄ μλ€.
μ‘°κΈ λ μμΈν μ΄ν΄λ³΄λ©΄,
μλ μλ°μ€ν¬λ¦½νΈμ μΌλ° ν¨μμμλ μλμ κ°μ΄ argumentsλΌλ μ μ¬ λ°°μ΄ κ°μ²΄κ° μλμΌλ‘ μ 곡λλ€.
function normalSum() {
console.log(arguments);
// [Arguments] { '0': 1, '1': 2, '2': 3 }
return arguments[0] + arguments[1] + arguments[2];
}
console.log(normalSum(1, 2, 3)); // 6
κ·Έλμ ν¨μμ μ μλ λ§€κ°λ³μ κ°μμ μκ΄ μμ΄, νΈμΆ μ μ λ¬λ λͺ¨λ μΈμκ° arguments μμ λ€μ΄κ°κ² λλ€.
(νμ§λ§ μ΄ argumentsλ λ°°μ΄μ²λΌ 보μ΄μ§λ§ μ§μ§ λ°°μ΄μ΄ μλ μ μ¬ λ°°μ΄ κ°μ²΄μ¬μ
map, reduce κ°μ λ°°μ΄ λ©μλλ₯Ό μ§μ μ°μ§λ λͺ» νλ€.)
κ·Έλ¬λ νμ΄ν ν¨μλ μμ λ§μ thisλ₯Ό κ°μ§ μλ―μ΄, μκΈ°λ§μ argumentsλ κ°μ§ μκΈ° λλ¬Έμ
μ΄κ²λ μΈλΆ μ€μ½νμ argumentsλ₯Ό κ·Έλ₯ κ°μ Έλ€κ° μ°κ² λλ€.
const arrow = () => {
console.log(arguments); // β ReferenceError (μΈλΆμ argumentsκ° μμΌλ©΄ μλ¬)
};
arrow(1, 2, 3);
λ¬Όλ‘ μ°λ¦¬κ° μ½λλ₯Ό μμ±ν λμ νμ΄ν ν¨μ μμμ λͺ¨λ μΈμλ₯Ό λ€λ£¨κ³ μΆμ κ²½μ°λ μμν λ°,
μ΄ κ²½μ°μλ arguments λμ κ·Έλ₯ μ§μ rest νλΌλ―Έν° μ μΈμ ν΄μ£Όλ©΄ λλ€.
rest νλ§λ¦¬ν°( ... )λ₯Ό μ¬μ©νλ©΄ ν¨μμ μ λ¬λ μΈμλ€μ μ§μ§ λ°°μ΄λ‘ λ°μμ€κΈ° λλ¬Έμ
λ°°μ΄ λ©μλ(map, filter, reduce λ±)λ₯Ό λ°λ‘ μΈ μλ μκ³ ,
ν¨μ μ μΈλΆμμ μ΄λ€ μΈμλ€μ λͺ¨μμ§ λͺ νν λλ¬λκΈ° λλ¬Έμ μ μ©νκ² μΈ μ μλ€.
const sum = (...args) => {
console.log(args); // [1, 2, 3] (μ§μ§ λ°°μ΄)
return args.reduce((a, b) => a + b, 0);
};
console.log(sum(1, 2, 3)); // 6
π νΉμ§ 3
λ§μ§λ§ νΉμ§μΌλ‘λ μμ±μ μ¬μ©μ΄ λΆκ°λ₯νλ€λ κ²μ΄ μλλ°, μ΄ λλ¬Έμ newμ ν¨κ» μΈ μ μλ€.
μλ₯Ό λ€μ΄μ μλ°μ€ν¬λ¦½νΈμμ μΌλ° ν¨μ(μ μΈλ¬Έ / ννμ)λ new ν€μλμ ν¨κ» νΈμΆνλ©΄
μλμ κ°μ΄ μμ±μ ν¨μμ²λΌ λμν μ μλ€.
function Person(name) {
this.name = name;
}
const p1 = new Person("μμ°");
console.log(p1.name); // "μμ°"
μλνλ©΄ newμ ν¨κ» ν¨μλ₯Ό νΈμΆνλ©΄ λ΄λΆμμ μλμΌλ‘ μλ‘μ΄ κ°μ²΄(this)κ° λ§λ€μ΄μ§κ³ , κ·Έ κ°μ²΄λ₯Ό λ°νν΄μ£ΌκΈ° λλ¬Έμ΄λ€.
κ·Έλ¦¬κ³ μ΄λ° ν¨μλ₯Ό λ°λ‘ μμ±μ ν¨μ(Costructor Function)μ΄λΌκ³ λΆλ₯΄λ κ²μ΄λ€.
(μμ±μ ν¨μ κ΄λ ¨ ν¬μ€ν μ°Έκ³ )
[리μ‘νΈ κΈ°μ΄ μ€ν°λ] JavaScriptμ μμ±μ ν¨μ λμ κ³Όμ
λͺ©μ°¨ (OPEN)π JavaScriptμ μμ±μ ν¨μ λμ κ³Όμ π§ μ 체 νλ¦ λ―Έλ¦¬ 보기π₯ μμ±μ ν¨μ μ μΈπ§ newλ‘ νΈμΆνκΈ°π¨ λ΄λΆ λμπ© μΌλ° νΈμΆκ³Όμ μ°¨μ΄μ π κ²°λ‘ π JavaScriptμ μμ±μ ν¨μ λμ κ³Ό
sso-codingdiary.tistory.com
νμ§λ§ νμ΄ν ν¨μμ new ν€μλλ₯Ό μ¬μ©ν΄λ³΄λ©΄ μλμ κ°μ μλ¬κ° λ°μνλ€.
const PersonArrow = (name) => {
this.name = name;
};
const p2 = new PersonArrow("μμ°");
// β TypeError: PersonArrow is not a constructor
κ·Έ μ΄μ λ μμ λ§νλ κ²μ²λΌ νμ΄ν ν¨μλ μκΈ°λ§μ thisλ₯Ό κ°μ§μ§ μκΈ° λλ¬Έμ΄λ€.
μμ±μ ν¨μλ λ΄λΆμμ μλ‘μ΄ thisλ₯Ό λ§λ€μ΄μ μμ±μ λΆμ΄λ κ² ν΅μ¬μΈλ°,
νμ΄ν ν¨μλ this μμ²΄κ° μμΌλκΉ μμ±μ μν μ ν μκ° μλ€.
λ°λΌμ κ°μ²΄λ₯Ό μ°μ΄λ΄λ μμ±μκ° νμνλ€λ©΄ λ°λμ μΌλ° ν¨μλ classλ₯Ό μ¬μ©ν΄μΌ νλ€λ μ μ μ κΈ°μ΅νκ³ μμ΄μΌ νλ€.
β μ΄μ 리
μλ°μ€ν¬λ¦½νΈ ν¨μ μ μΈ λ°©μλ€μ νλμ λΉκ΅νλ©΄ μλμ κ°λ€.
// 1) ν¨μ μ μΈλ¬Έ (νΈμ΄μ€ν
O)
function add(a, b) {
return a + b;
}
// 2) μ΅λͺ
ν¨μ ννμ (νΈμ΄μ€ν
μ μ¬μ© λΆκ°)
const add2 = function (a, b) {
return a + b;
};
// 3) κΈ°λͺ
ν¨μ ννμ (λ΄λΆ μ΄λ¦μΌλ‘ μκΈ°μ°Έμ‘°/μ€ν μΆμ μ©μ΄)
const add3 = function addInternal(a, b) {
return a + b;
};
// 4) νμ΄ν ν¨μ (this μμ, κ°κ²°/ννμ λ°ν)
const add4 = (a, b) => a + b;
π μ°Έκ³
μ΄λ€ μν©μμ μ΄λ€ ν¨μλ₯Ό μ°λ©΄ μ’μκΉ?
- ν¨μ μ μΈλ¬Έ ππ» μ νΈ ν¨μ, λͺ¨λ ν¨μ (νμΌ μλ¨μ μ μΈν΄λκ³ μ΄λμλ νΈμΆ)
- μ΅λͺ ν¨μ ννμ ππ» μ½λ°± ν¨μ (μ§§κ³ λ¨μν μ½λ)
- κΈ°λͺ ν¨μ ννμ ππ» μ¬κ· ν¨μ, λλ²κΉ μ΄ νμν ν¨μ
- νμ΄ν ν¨μ ππ» μ½λ°±, λ°°μ΄ λ©μλ(map, filter, reduce) λ± κ°λ¨ν λ‘μ§
π κ²°λ‘
μ΄λ² ν¬μ€ν μ μμ±νλ©΄μ ν¨μκ° μΌκΈ κ°μ²΄μ΄κΈ° λλ¬Έμ κ°λ₯ν ν¨ν΄λ€μ΄ λ§κ³ ,
νμ΄ν ν¨μλ this μ²λ¦¬ λλ¬Έμ νΉν μ μ©νλ€λ μ μ μ μ μμλ€.
μμΌλ‘λ ν¨μ μ μΈ λ°©μμ μ΅κ΄μ μΌλ‘ μ°κΈ° 보λ€λ
μν©μ λ§κ² κ°μ₯ μ μ ν μ μΈ λ°©μμ μμμ μΌλ‘ μ ννλ €λ λ Έλ ₯μ ν΄μΌκ² λ€.