GitHubμ μλ 33 Concepts Every JavaScript Developer Should Know λΌλ 리ν¬μ§ν 리μ λ΄μ© μ€ κ³΅λΆνκ³ μΆμ μν°ν΄μ λ΄κ° μ 리ν κ²Έ κΈ°μ΅ν κ²Έ μμ±νλ λ²μκΈμ΄λ€. 33κ°μ§ μ€ μ¬μ― λ²μ§ΈμΈ Function Scope, Block Scope and Lexical Scopeμ κ΄λ ¨λ λ΄μ©μ΄λ€.
β» λ΄λ³΄λ΄λ²(λ΄κ° λ³΄λ €κ³ λ΄κ° λ²μν): μμ΄ μ 곡μλ ν΄μΈ μ ννλ μλκΈ°μ λ²μμλ μμ, μ€μ, κ΅¬κΈ λ²μμ΄ λ¬΄μν λ§μ μ μμΌλ©°, μ€νλ λ§μ μ μλ€. μ νν λ΄μ©μ μλ¬Έμ μ§μ μ΄ν΄λ³΄κ±°λ λ€λ₯Έ μ 보λ€μ λ μ°Ύμ보λ κ²μ μΆμ²νλ€.
(νμ§λ§ λκΈ νΌλλ°±λ νμν©λλ€π )
μ΄λ²μ κ³ λ₯Έ μν°ν΄μ Brandon Morelli λμ΄ μμ±νμ JavaScript Functions — Understanding The Basics μ΄λ€. λ΄μ© μ€κ°μ€κ° π€μ΄ μμ΄μ½μ λ³Έλ¬Έμ λμ μμ§ μμ λ²μ νλ©° μΆκ°ν λ§μ΄λ€. ν¨μ Invokingκ³Ό callμ ꡬλΆμ λκΈ° μν΄μ callμ νΈμΆλ‘ λ²μνμκ³ invokingμ κ·Έλλ‘ μλ¬ΈμΌλ‘ λμλ€.
ν¨μλ 무μμΈκ°?
- ν¨μλ νΉμ μ무λ₯Ό μννκΈ° μν΄ κ³ μλ μλΈ νλ‘κ·Έλ¨μ΄λ€.
- ν¨μλ νΈμΆ(call)λ λ μ€νλλ€. μ΄λ₯Ό ν¨μ invokingμ΄λΌκ³ νλ€.
- κ°μ ν¨μλ‘ μ λ¬λμ΄ ν¨μ λ΄λΆμμ μ¬μ©ν μ μλ€.
- ν¨μλ νμ κ°μ λ°ννλ€. μλ°μ€ν¬λ¦½νΈμμ λ°ν κ°μ΄ λͺ μλμ΄ μμ§ μμΌλ©΄, ν¨μλ undefinedλ₯Ό λ°ννλ€.
- ν¨μλ κ°μ²΄μ΄λ€.
ν¨μλ₯Ό μ μνκΈ°.
μλ°μ€ν¬λ¦½νΈμμλ ν¨μλ₯Ό μ μνλ μ¬λ¬ λ€λ₯Έ λ°©λ²λ€μ΄ μλ€:
ν¨μ μ μΈμμ μ΄λ¦μ΄ μλ ν¨μλ₯Ό μ μνλ€. ν¨μ μ μΈμμ μμ±νλ €λ©΄ function ν€μλ λ€μμ ν¨μμ μ΄λ¦ μ¬μ©νλ€. ν¨μ μ μΈμμ μ¬μ©ν λ, ν¨μ μ μλ νΈμ΄μ€ν λκ³ , κ·Έλ κΈ° λλ¬Έμ ν¨μκ° μ μλκΈ° μ μλ ν΄λΉ ν¨μλ₯Ό μ¬μ©ν μ μλ€.
function name(parameters){
statements
}
ν¨μ ννμμ μ΄λ¦μ΄ μμ μλ νΉμ μ΅λͺ μ ν¨μμΌ μλ μλ€. μ΅λͺ ν¨μλ μ΄λ¦μ΄ μλ ν¨μλ₯Ό λ§νλ€. ν¨μ ννμμ νΈμ΄μ€ν λμ§ μκΈ° λλ¬Έμ ν¨μκ° μ μλκΈ° μ΄μ μ μ¬μ©ν μ μλ€. μλμ μμμμ μ΅λͺ ν¨μ κ°μ²΄λ₯Ό λ³μμ ν λΉνλ€.
let name = function(parameters){
statements
}
νμ΄ν ν¨μ ννμμ ν¨μ ννμμ μν λ 짧μ ꡬ문μ΄λ€. νμ΄ν ν¨μλ ν΄λΉ ν¨μ μμ μ this κ°μ μμ±νμ§ μλλ€.
let name = (parameters) => {
statements
}
νλΌλ―Έν° vs. μΈμ
μλ°μ€ν¬λ¦½νΈκ° μ²μμ΄λΌλ©΄ μλ§λ νλΌλ―Έν°μ μΈμκ° μλ‘ λ°κΏμ μ¬μ©λλ κ²μ λ€μ΄λ³΄μμ κ²μ΄λ€. λΉμ·νκΈ΄ νλ©΄μλ, μ΄ λ ν€μλ μ¬μ΄μλ μ€μν μ°¨μ΄κ° μλ€.
νλΌλ―Έν°λ ν¨μλ₯Ό μ μν λ μ¬μ©λλ€. νλΌλ―Έν°λ ν¨μ μ μ λ΄λΆμ μμ±λλ μ΄λ¦μ΄λ€. μ¬μ€ ν¨μ μ μν λ, μ΅λ 255κ°μ νλΌλ―Έν°κΉμ§ λκ²¨μ€ μ μλ€! νλΌλ―Έν°λ κ΄νΈ() μμ λ°μ (μ½€λ§)μΌλ‘ ꡬλΆλλ€. param1κ³Ό param2 λ νλΌλ―Έν°μ λν μμ κ° μλ€.
const param1 = true;
const param2 = false;
function twoParams(param1, param2){
console.log(param1, param2);
}
μΈμλ λ°λ©΄μ ν¨μκ° μ€νλ λ (invoked) κ° νλΌλ―Έν°λ‘λΆν° ν¨μκ° λ°λ κ°μ΄λ€. μμ μμ μμ λ μΈμλ trueμ falseμ΄λ€.
ν¨μλ₯Ό Invoking νκΈ°
ν¨μλ νΈμΆλλ©΄ μ€ννλ€. μ΄ κ³Όμ μ΄ invocationμ΄λ€. ν¨μ μ΄λ¦μ μΈκΈνκ³ λ€μ κ΄νΈλ₯Ό μ΄κ³ λ«μ:()μΌλ‘ invoke ν μ μλ€.
μμ λ₯Ό μ΄ν΄λ³΄μ.
κ΅¬κΈ ν¬λ‘¬μ μ¬μ©νκ³ μμλ©΄ κ°λ°μ μ½μ μ°½μ μ΄μ΄μ κ°μ΄ μμ λ₯Ό μμ±ν΄λ³Ό μ μλ€. [WINDOWS]: Ctrl + Shift + J [MAC]: Cmd + Opt + J
λ¨Όμ , logItμ΄λΌλ ν¨μλ₯Ό μ μνλ€. μ΄ ν¨μλ nameμ΄λΌλ νλΌλ―Έν°λ₯Ό νλλ₯Ό λ°λλ€. μ€ν μμ, ν¨μλ μ½μμ nameμ μΆλ ₯ν κ²μ΄λ€:
function logIt(name){
console.log(name);
}
ν¨μλ₯Ό invoke νκΈ° μν΄μ λ¨μΌ νλΌλ―Έν°λ₯Ό μ λ¬νλ©΄μ νΈμΆνλ€. μ¬κΈ° μ΄ ν¨μλ₯Ό name Joeλ‘ νΈμΆνκ³ μλ€:
logIt('Joe');
// Joe
ν¨μμ νλΌλ―Έν°κ° μλ€λ©΄ ν΄λΉ ν¨μλ₯Ό λΉ κ΄νΈλ‘ invoke ν μ μλ€:
function logIt2(){
console.log('The second one');
}
logIt2();
// The second one
ν¨μ λ°ν
μλ°μ€ν¬λ¦½νΈμμ λͺ¨λ ν¨μλ λͺ μλμ΄ μμ§ μμΌλ©΄ undefinedλ₯Ό λ°ννλ€.
μ΄ μ μ λν΄ λΉ ν¨μλ₯Ό μμ±νκ³ invoking νμ¬ ν μ€νΈν΄λ³΄μ:
function test(){};
test();
// undefined
λ©μ§λ€, μμνλ―μ΄ undefinedκ° λ°νλμλ€.
μ΄μ , μ¬μ©μκ° ν¨μμμ λ°ννκ³ μ νλ κ²μ return ν€μλ λ€μ λ°νν κ°κ³Ό ν¨κ» λ°νν μ μλ€. μλμ μ½λλ₯Ό 보μ:
function test(){
return true;
};
test();
// true
μ΄ μμ μμ λͺ μμ μΌλ‘ ν¨μμκ² trueλ₯Ό λ°νν κ²μ μλ €μ€λ€. ν΄λΉ ν¨μλ₯Ό invoke νλ©΄ λ°λ‘ trueκ° λ°νλλ€.
κ·Έλ°λ° μ μ΄ μ μ΄ μ€μν κΉ?
μλνλ©΄ ν¨μκ° λ°ννλ κ°μ΄ μ¬μ€ κ·Έ ν¨μλ₯Ό νΈμΆν κ³³μΌλ‘ λ°ννλ κ²μ΄κΈ° λλ¬Έμ μ€μνλ€. μ΄ μ½λλ₯Ό 보μ:
let double = function(num) {
return num * 2;
}
μ΄ ν¨μ ννμμ num νλΌλ―Έν°μ κ°μ λ λ°°λ‘ λ°ννλ ν¨μλ₯Ό μμ±ν κ²μ΄λ€. ν΄λΉ ν¨μλ₯Ό invoke νκ³ λ°ν κ°μ λ³μμ μ μ₯ν μ μλ€:
let test = double(3);
μ°λ¦¬κ° test κ°μ μΆλ ₯ν΄λ³΄λ©΄ 6μ νμΈν μ μλ€:
console.log(test);
// 6
λ©μ§λ€! returnμ ν¨μμμ κ°μ λ°νν λΏ μλλΌ ν¨μλ₯Ό νΈμΆν 무μμ΄λ κ·Έκ²μ κ°μ ν λΉνλ€.
return λ¬Έμ λ€λ₯Έ μ€μν κ·μΉμ ν¨μμ μ€νμ μ¦μ μ€λ¨νλ€λ κ²μ΄λ€.
λ κ°μ returnλ¬Έμ΄ μλ test ν¨μμ λν μμ λ₯Ό κ³ λ €ν΄λ³΄μ:
function test(){
return true;
return false;
};
test();
// true
μ²μ return λ¬Έμ ν¨μ μ€νμ μ¦κ° μ€λ¨νκ³ ν¨μκ° trueλ₯Ό λ°ννλλ‘ νλ€. μΈ λ²μ§Έ μ€μ: return false;λ μ λ μ€νλμ§ μλλ€.
ν¨μ κ°μ²΄
ν¨μλ ν¨μ κ°μ²΄μ΄λ€. μλ°μ€ν¬λ¦½νΈμμ κΈ°λ³Έν(undefined, null, boolean, number, string)μ΄ μλ κ²μ 무μμ΄λ κ°μ²΄μ΄λ€. μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄λ λ§€μ° λ€μ©λλ‘ μ¬μ©ν μ μλ€. μ΄ λλ¬Έμ, μ°λ¦¬λ ν¨μμ λ€λ₯Έ ν¨μλ₯Ό νλΌλ―Έν°λ‘ λκ²¨μ€ μλ μλ€.
ν¨μκ° λ€λ₯Έ ν¨μλ₯Ό νλΌλ―Έν°λ‘ λ°μ λλ ν¨μλ₯Ό λ°νν λ, κ³ μ°¨ ν¨μ(higher-order function)μ΄λΌλ κ²μ νΈμΆνλ€. μλ§λ μ΄λ―Έ λ§μ κ³ μ°¨ ν¨μλ₯Ό μ¬μ§μ΄ 무μμΈμ§λ λͺ¨λ₯Έ μ± μ¬μ©ν΄ 보μμ κ²μ΄λ€: Array.prototype.map, Array.prototype.filterκ° κ³ μ°¨ ν¨μμ΄λ€.(λͺ κ°λ§ μΈκΈν κ²μ΄λ€.) μ΄μ μ μ¨λ μν°ν΄λ€μ ν΅ν΄ μλ°μ€ν¬λ¦½νΈμ κ°μ²΄μ κ³ μ°¨ ν¨μμ λν΄ μμλ³Ό μ μλ€.
μ£Όμμ
μνν λ΄μ©λ€μ΄ λ§λ€. μ¬κΈ° μ€μν κ²λ€μ λν λͺ©λ‘μ μ μ΄λλ€.
- ν¨μλ νΉμ μ무λ₯Ό μννκΈ° μν΄ κ³ μλ μλΈ νλ‘κ·Έλ¨μ΄λ€.
- ν¨μ μ μΈμμ νΈμ΄μ€ν λλ€ - ν¨μ ννμμ κ·Έλ μ§ μλ€.
- ν¨μλ νΈμΆ(call)λ λ μ€νλλ€. μ΄λ₯Ό ν¨μ invokingμ΄λΌκ³ νλ€.
- κ°μ ν¨μλ‘ μ λ¬λ μ μμΌλ©° ν¨μ λ΄λΆμμ μ¬μ©λ μ μλ€. κ·Έ κ°μ μ΄λ¦μ νλΌλ―Έν°μ΄κ³ , μ€μ κ°μ μΈμλΌκ³ λΆλ₯Έλ€.
- ν¨μλ νμ κ°μ λ°ννλ€. μλ°μ€ν¬λ¦½νΈμμ return κ°μ΄ λͺ μλμ΄ μμ§ μμΌλ©΄ ν¨μλ κΈ°λ³Έμ μΌλ‘ undefinedλ₯Ό λ°ννλ€.
- ν¨μλ κ°μ²΄μ΄λ€.