π» ν¨μ(function)
λ°μ΄ν°λ₯Ό μ μ₯ν λμλ 'λ³μ'λ₯Ό μ¬μ©νλ€. λ³μμλ λ°μ΄ν°λ₯Ό μ μ₯λ§ ν μ μκ³ μ½λλ μ μ₯ν μ μμ΅λλ€.
νμ§λ§ ν¨μλ₯Ό μ¬μ©νλ©΄ μ½λλ₯Ό λ©λͺ¨λ¦¬μ μ μ₯νλ€κ° νμν λ λ§λ€ νΈμΆνμ¬ μ¬μ©ν μ μμ΅λλ€.
μ¦, μ½λλ₯Ό μ μ₯νκ³ μ¬μ¬μ©ν μ μμ΅λλ€.
ν¨μλ νλ‘κ·Έλλ° μ½λλ₯Ό μ μ₯νλ 곡κ°μ΄λΌκ³ ν μ μμ΅λλ€.
μλ°μ€ν¬λ¦½νΈ ν΄μκΈ°κ° ν¨μλ₯Ό λ§λλ©΄ ν΄λΉ ν¨μλ₯Ό λ©λͺ¨λ¦¬ 곡κ°μ 'κΈ°μ΅'μ ν©λλ€.
μ¦, ν¨μλ₯Ό λ§λλ μκ° μ€ννμ§ μκ³ κΈ°μ΅λ§ ν΄λλ€κ°, ν¨μλ₯Ό νΈμΆνκ² λλ©΄ κ·Έ μμ μ ν΄λΉ ν¨μλ₯Ό μ€νν©λλ€.
[κΈ°λ³Έν] 1. μΌλ° ν¨μ μ μλ¬Έ <- λ¬Έμ₯ -------------------- function ν¨μλͺ (){μ€νμν¬ μλ°μ€ν¬λ¦½νΈ μ½λ;} ν¨μλͺ (); -> μΌλ°ν¨μλ₯Ό νΈμΆνλ νΈμΆλ¬Έ. ν΄λΉ μ€μμ ν¨μλ₯Ό μ€νν©λλ€. 2. ν¨μ ννμ(μ΅λͺ ν¨μ) <- μ°μ°μ -------------------- var μ°Έμ‘°λ³μ = function(){μ€νμν¬ μλ°μ€ν¬λ¦½νΈ μ½λ;} λ³μλͺ (); -> μ΅λͺ ν¨μλ₯Ό νΈμΆνλ νΈμΆλ¬Έ. ν΄λΉ μ€μμ ν¨μλ₯Ό μ€νν©λλ€.
π ν¨μμ λ³μμ μ°¨μ΄μ
λ³μ - 1κ°μ λ°μ΄ν°λ§ μ μ₯ κ°λ₯ν©λλ€. - var λλ let, constμ κ°μ ν€μλλ₯Ό μ¬μ©ν©λλ€. - λ¬Έμν, μ«μν, λ Όλ¦¬νκ³Ό κ°μ λ°μ΄ν°λ₯Ό μ μ₯ν μ μμ΅λλ€. - κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μμ΅λλ€.
ν¨μ - μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ μ₯νλ€. - functionμ΄λΌλ ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈνλ€. - μΆλ ₯λ¬Έ, μ μ΄λ¬Έ λ±μ μ½λλ₯Ό μ μ₯ν μ μκ³ , μ½λκ° μ€νλ κ²°κ΄κ°μ λ°νν©λλ€.
π ν¨μμ νΈμ΄μ€ν
νΈμ΄μ€ν μ μ¬μ μ μΈ μλ―Έλ‘ 'λμ΄μ¬λ¦¬λ€'λΌλ λ»μ΄ μμ΅λλ€.
μΌλ° ν¨μ μ μλ¬Έμ κ²½μ° ν¨μ νΈμΆ μ νΈμ΄μ€ν (hoisting)κΈ°μ μ μ§μν©λλ€.
νΈμ΄μ€ν μ΄λ ν΄λΉ ν¨μλ₯Ό μλ°μ€ν¬λ¦½νΈμ μ΅μλ¨μμΉλ‘ λμ΄μ¬λ €μ κΈ°μ΅νλ κ²μ λ§ν©λλ€.
νΈμ΄μ€ν μ μ μ©νλ©΄ ν¨μμ μλ¬Έλ³΄λ€ νΈμΆλ¬Έμ΄ λ¨Όμ λμλ ν¨μμ μλ¬Έμ λμ΄μ¬λ € ν¨μλ₯Ό νΈμΆν©λλ€.
νμ§λ§ μ΅λͺ ν¨μλ νΈμ΄μ€ν κΈ°μ μ μ§μνμ§μμ΅λλ€.
λ°λΌμ λ°λμ ν¨μκ° λ¨Όμ λ±μ₯ν μ΄νμ νΈμΆν μ μμ΅λλ€.
π μ§κΈκΉμ§μ λ΄μ©μ μ€μ λ‘ μμ±ν΄λ΄ μλ€!
//ν¨μ νΈμΆ <- νΈμ΄μ€ν o (μΌλ°ν¨μλΌμ ν¨μλΆν° λΆλ¬λ ν¨μμ μλ¬Έμ λ¨Όμ μΈμ(νΈμ΄μ€ν )νκ³ μΆλ ₯) myFnc(); //μΌλ°ν¨μ (ν¨μλͺ μ μ΄λ¦μ λΆμ¬νμΌλκΉ) - ν¨μνΈμΆλ¬Έλ³΄λ€ μλμ μμ΄λ μ μμλνλ€. function myFnc() { count++; document.write("hello" + count, "<br/>"); } //ν¨μ νΈμΆ myFnc(); document.write("--------------ꡬλΆμ --------------", "<br/>"); // theFnc(); <- νΈμ΄μ€ν x (ν¨μμ μλ₯Ό λ¨Όμ ν΄μΌν¨_μ¬κΈ°λΆν° μ€λ₯λ°μν΄μ μλ theFnc μ λΆ μ€νx) //μ΅λͺ ν¨μ (function λ€μ μ΄λ¦μ΄ μλ/μλ) - μ΅λͺ ν¨μλ ν¨μκ° μ μΈλ μ΄νμλ§ νΈμΆν μ μλ€. var theFnc = function () { count++; document.write("bye" + count, "<br/>"); }; //ν¨μ νΈμΆ theFnc(); //ν¨μκ° μμ κ²½μ° λ μλ₯Ό λνλ μ λ§λ€κΈ° var num1 = 10; var num2 = 3; var result = num1 + num2; document.write(result, "<br/>"); //μ μμ ν¨μλ‘ μ μ₯νμ¬ νΈμΆνκΈ° function addNum() { var num1 = 10; var num2 = 3; var result = num1 + num2; document.write(result, "<br/>"); } //ν¨μνΈμΆλ¬Έμ μ΄μ©νμ¬ μνλ νμλ§νΌ ν¨μ μ€ννκΈ° addNum(); addNum(); addNum(); addNum();
πΌ varλ₯Ό μ΄μ©ν λ³μμ νΉμ§
μλ°μ€ν¬λ¦½νΈ ES6λ²μ μμλ λ³μλ₯Ό μ μΈνκΈ° μν΄ letκ³Ό constλΌλ μλ‘μ΄ μμ½μ΄κ° μκ²Όμ΅λλ€.
varμ let, constλ νΈμ΄μ€ν κΈ°μ κ³Ό μ€μ½νμ ν° μ°¨μ΄κ° μμ΅λλ€.
π· λ³μμ μ μ©λ²μ 'μ€μ½ν' μμ보기
μλ°μ€ν¬λ¦½νΈμμ λ³μλ₯Ό μ μΈνκ³ μ¬μ©ν λ λ³μκ° μ μ©λλ μ ν¨λ²μλ₯Ό 'μ€μ½ν(scope)'λΌκ³ ν©λλ€.
μ¦, λ³μκ° μ΄λκΉμ§ μ ν¨ν μ§ κ°λ¦¬ν€λ λ²μλ₯Ό λ§ν©λλ€.
μλ°μ€ν¬λ¦½νΈ ν¨μμμ λ³μλ₯Ό μ¬μ©ν λ μλ μ΄ μμμ μ£Όμν΄μΌ ν©λλ€.
ν ν¨μμμμλ§ μ¬μ©νκ³ λ€λ₯Έ ν¨μμμλ μ¬μ©ν μ μλ λ³μκ° μλκ°νλ©΄,
μ΄λ ν¨μμμλ λ€ μ¬μ©ν μ μλ λ³μκ° μμ΅λλ€.
ν ν¨μμμμλ§ μ¬μ©ν μ μλ λ³μλ₯Ό 'μ§μλ³μ' λλ 'λ‘컬λ³μ'λΌκ³ λΆλ₯΄κ³ ,
μ΄λ ν¨μμμλ λ€ μ¬μ©ν μ μλ λ³μλ₯Ό 'μ μλ³μ' λλ 'κΈλ‘λ²λ³μ'λΌκ³ λΆλ¦ λλ€.
μ§μλ³μλ {}μμμλ§ μ ν¨ν©λλ€. μ΄λ° μ€μ½ν(μ ν¨λ²μ)λ₯Ό 'λΈλ‘λ 벨'μ μ€μ½νλΌκ³ νκ³ ,
μ μλ³μλ 'ν¨μλ 벨μ μ€μ½ν'λ₯Ό κ°μ§λ€λΌκ³ ννν©λλ€.
π· ν¨μ μμμλ§ μΈ μ μλ μ§μλ³μ
μ§μλ³μλ ν¨μ μμμ μ μΈνκ³ , ν¨μ μμμλ§ μ¬μ©ν©λλ€.
μ§μλ³μλ₯Ό μ μΈνλ €λ©΄ μμ½μ΄ varμ ν¨κ» λ³μ μ΄λ¦μ μ§μ ν©λλ€.
μ§μλ³μλ ν΄λΉ ν¨μμ λ°κΉ₯μΌλ‘λ λμ¬ μ μμ΅λλ€.
μλ μμ μ²λΌ ν¨μ μμμ μ μΈλ λ³μλ₯Ό ν¨μ λ°μμ μΆλ ₯νλ €κ³ νλ©΄ μ ν¨λ²μλ₯Ό λ²μ΄λμ μ€λ₯κ° λ°μν©λλ€.
π· μ€ν¬λ¦½νΈμμ μμ λ‘κ² μΈ μ μλ μ μλ³μ
μ μλ³μλ μ μ© λ²μλ₯Ό μ ννμ§μκ³ μΈ μ μμ΅λλ€.
μ¦, μ μλ³μλ μ§μλ³μμ λ¬λ¦¬ μ€ν¬λ¦½νΈ μμ€ μ 체μμ μ¬μ©ν μ μμ΅λλ€.
μ μλ³μλ‘ μ¬μ©νλ €λ©΄ ν¨μ λ°μμ μ μΈνκ±°λ, ν¨μμμμ varλΌλ ν€μλ μμ΄ μ μΈν΄μΌν©λλ€.
ν¨μμμμ μ μΈνλλΌλ varλΌλ μμ½μ΄κ° μμΌλ©΄ μ μλ³μλ‘ μ¬μ©λ©λλ€.
μ μλ³μλ ν¨μ μνμΌλ‘ μ¬μ©ν μ μμ + κ·Έ λ³μλͺ μ λ λ§κ³ λ€λ₯Έ κ°λ°μκ° μΈ μλ μμ΅λλ€.
π» μ§κΈκΉμ§μ λ΄μ©μ μ€μ λ‘ μμ±ν΄λ΄ μλ€!
var num1 = 30; // μ μλ³μ(ν¨μ λ°κΉ₯μ μμΌλ―λ‘) function addNum() { var sum = 10 + 20; //μ§μλ³μ. λ³μ sumμ μ μ©λ²μλ addNumμ΄λ€. //ν¨μ μμμ sumμ κ°μ μ½μμ°½μ μΆλ ₯νλΌκ³ νμΌλ―λ‘, μ ν¨λ²μ μμ μμ΄ μ μμ μΌλ‘ 30μ΄λΌλ κ°μ 보μ¬μ€λ€. console.log("ν¨μμμμλ μ§μλ³μ sum : " + sum); //30 //μ μλ³μ(ν¨μ μμμμ§λ§, varκ° μμΌλ―λ‘) result = 100 + 200; result2 = sum + num1; } addNum(); //λͺ¨λ μ μλ³μμ΄λ―λ‘ μ μμ€ν console.log("μ μλ³μ result : " + result); //300 / resultλ function addNum()μμμ μ μν건λ°, var μλ€κ³ λ°μμ μΆλ ₯ν΄λ μΆλ ₯λ¨. console.log("μ μλ³μ result2 : " + result2); // "Uncaught ReferenceError: sum is not defined" -> λ³μ sumμ μ μλμ μ΄ μλ€λ μ€λ₯ //console.log(sum); //μ§μλ³μ var sumμ΄ μ ν¨λ²μλ₯Ό λ²μ΄λ¬κΈ° λλ¬Έμ μ½μμ°½μ μ€λ₯κ° λ°μνλ€.
π varμ νΈμ΄μ€ν
μλ°μ€ν¬λ¦½νΈμμ λ³μλ₯Ό μ¬μ©ν λ μ‘°μ¬ν΄μΌ ν κ°λ μ΄ μμ΅λλ€.
λ°λ‘ νΈμ΄μ€ν (hoisting)μ λλ€.
νΈμ΄μ€ν μ΄λ 'λμ΄μ¬λ¦°λ€'λΌλ λ»μΌλ‘ μν©μ λ°λΌ λ³μμ μ μΈ(var λ³μλͺ )κ³Ό ν λΉ(λ³μμ κ°μ λ£λ κ²)μ λΆλ¦¬νμ¬,
μ μΈ λΆλΆμ μ€μ½νμ κ°μ₯ μμͺ½μΌλ‘ λμ΄μ¬λ¦¬λ κ²μ λ§ν©λλ€.
λμ΄μ¬λ¦°λ€κ³ ν΄μ μ€μ μμ€μ½λλ₯Ό λμ΄μ¬λ¦¬λ κ²μ μλκ³ ,
μμ€λ₯Ό κ·Έλ° λ°©μμΌλ‘ ν΄μνλ€λ μλ―Έμ λλ€.
π λ³μμ μ¬μ μΈκ³Ό μ¬ν λΉ
varλ₯Ό μ΄μ©ν λ³μλ νΈμ΄μ€ν μ΄μΈμλ 'μ¬μ μΈ'κ³Ό 'μ¬ν λΉ'μ ν μ μμ΅λλ€.
μ¬μ μΈμ΄λ var ν€μλλ₯Ό μμ λΆμ¬μ μ¬λ¬ λ² λμΌν μ΄λ¦μ μ°λ κ²μ μ¬μ μΈμ΄λΌκ³ ν©λλ€.
μ¦ var i = 0; μ΄νμ var i; μ΄λ°μμΌλ‘ λμΌν μ΄λ¦μ varλ₯Ό λΆμ¬ μ¬λ¬ λ² μ μΈνλ κ²μ λ§ν©λλ€.
μ¬μ μΈμνλ©΄ μ΄μ μ λ§λ€μλ λ³μλ μ¬λΌμ§λλ€.
μ¬ν λΉμ΄λ λ³μμ κ°μ λ€μ μλ‘ λ£λ κ²μ λ§ν©λλ€.
μ¦, var i = 0; μ΄νμ i = 10;μ²λΌ κ°μ μλ‘ ν λΉνλ κ²μ λ§ν©λλ€.
μ¬ν λΉμ νλ©΄ μ΄μ μ μλ κ°μ μ¬λΌμ§λλ€.
/* νΈμ΄μ€ν */ var x = 10; //μ μλ³μ(ν¨μ λ°κΉ₯) // function displayNumber() μμμλ var y = 20; μ μ½μyλ³΄λ€ μμͺ½μ var y; λ κ°μ (κ·Έλμ μΆλ ₯νμ λ undefinedλμ΄) function displayNumber() { //var y; νΈμ΄μ€ν μ μν΄ yκ° μ μΈλ κ²μΌλ‘ μ·¨κΈν¨. console.log("xλ : " + x); //10 console.log("yλ : " + y); //yμ μΈνμ μλ€κ³ μ€λ₯λμΌνμ§λ§, νΈμ΄μ€ν λλ¬Έμ μλ‘ μ¬λΌκ°μ yκ° μλ€κ³ μκ° β³μμ§ κ° μ νμ μμ΄μ undefined //yμ νΈμ΄μ€ν μ΄ μΌμ΄λ¨. κ°μ΄ λμ€μ ν λΉλ κ²μΌλ‘ μ·¨κΈν¨. var y = 20; //var λμ letμΌλ‘ λ°κΎΈλ©΄ μ€λ₯ - letμ νΈμ΄μ€ν x } displayNumber(); //ν¨μνΈμΆ /* μ¬μ μΈκ³Ό μ¬ν λΉ */ function addNum(num1, num2) { //λ§€κ°λ³μ num1,2 return num1 + num2; } var sum = addNum(10, 20); console.log(sum); //30 sum = 50; console.log(sum); //50 <- λ°λ‘ μμ€μμ sum=50μ΄λΌκ³ κ°μ 'μ¬ν λΉ'ν¨ var sum = 100; //λ³μλ₯Ό λ€μ μ μΈν¨(μ¬μ μΈ) console.log(sum);
β¨ letκ³Ό const
varμμ½μ΄λ₯Ό μ¬μ©νλ λ³μλ ν¨μμμμ μ€μ½ν(μ μ)μ κ°μ§κ³ , μ¬ν λΉκ³Ό μ¬μ μΈμ ν μ μμ΅λλ€.
κ·Έλμ varμμ½μ΄λ₯Ό μλͺ» μ¬μ©νλ©΄ μμνμ§ λͺ»ν νλ‘κ·Έλλ° μ€λ₯κ° λ°μν μ μμ΅λλ€.
κ·Έλμ ES6λ²μ λΆν°λ varλ₯Ό 보μν letκ³Ό constλ₯Ό μ¬μ©ν©λλ€.
π letμ μ΄μ©ν λ³μμ νΉμ§
ES6 μ΄μ μ μλ°μ€ν¬λ¦½νΈ νλ‘κ·Έλ¨μμλ varμμ½μ΄λ‘λ§ λ³μλ₯Ό μ μΈνμ΅λλ€.
varμμ½μ΄λ₯Ό λΉ λ¨λ¦¬λ©΄ μλνμ§ μκ² μ μλ³μκ° λκΈ°λ νκ³ ,
νλ‘κ·Έλ¨ κΈΈμ΄κ° κΈΈμ΄μ§λ€λ³΄λ©΄ μ€μλ‘ μ¬μ©νλ λ³μλ₯Ό μ¬μ μΈνκ±°λ, κ°μ μ¬ν λΉ ν΄λ²λ¦¬λ κ²½μ°κ° μκΈ°κΈ°λ ν©λλ€.
κ·Έλμ ES6λ²μ λΆν°λ letκ³Ό constκ° μΆκ°λμκ³ , λλλ‘μ΄λ©΄ varμμ½μ΄λ μ¬μ©νμ§μλκ²μ κΆμ₯ν©λλ€.
varμ let,constμ κ°μ₯ ν° μ°¨μ΄λ μ€μ½ν λ²μμ λλ€.
varλ ν¨μμμ(λ 벨)μ μ€μ½νλ₯Ό κ°μ§μ§λ§ letκ³Ό constλ λΈλ‘μμμ μ€μ½νλ₯Ό κ°μ§λλ€.
π λΈλ‘μμμλ§ μ¬μ©ν μ μλ λ³μ
letμμ½μ΄λ‘ μ μΈν λ³μλ λ³μλ₯Ό μ μΈν λΈλ‘({}λ‘ λ¬Άμ λΆλΆ)μμλ§ μ ν¨νκ³ ,
λΈλ‘μ λ²μ΄λλ©΄ μ¬μ©ν μ μμ΅λλ€.ν¨μλ°μμ μ μΈνλ©΄ μ μν¨μλ‘ μ¬μ©κ°λ₯)
letμμ½μ΄λ₯Ό μ¬μ©ν λ³μλ 'μ¬ν λΉμ κ°λ₯νμ§λ§, μ¬μ μΈμ λΆκ°ν©λλ€.'
varμμ½μ΄λ₯Ό μ¬μ©ν λ³μλ μ μΈνκΈ° μ΄μ μ μ€ννλλΌλ νΈμ΄μ€ν λλ¬Έμ,
μμ§ ν λΉλμ§ μμμμ μλ―Ένλ 'undefined'κ°μ κ°μ§ μ μμ΅λλ€.
νμ§λ§ letμμ½μ΄λ₯Ό μ¬μ©ν λ³μλ μ μΈνκΈ° μ μ μ¬μ©ν κ²½μ° μ€λ₯λ₯Ό λ°μμν΅λλ€.
ReferenceErrorμμ Cannot access 'y' before initialization at displayNumber μ€λ₯λ
displayNumberλΌλ ν¨μμμ λ³μ yκ° μ μΈλμ§μμκ³ , μ΄κΈ°νλμ§ μμ μ¬μ©ν μ μμμ μλ €μ€λλ€.
[μλ¬μ’ λ₯] -μ½μμ°½μμ νμΈκ°λ₯ - ReferenceError : μ‘΄μ¬νμ§ μλ λ³μλ₯Ό μ°Έμ‘°ν λ λ°μνλ μλ¬ - SyntaxError : λ¬Έμμ΄μ λ°μ΄νλ κΈ°νΈκ° μλͺ»λμ λ λ°μνλ μλ¬. λ¬Έλ² μλ¬ - TypeError : μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μ€μ½νκ²μμ μ±κ³΅νμ§λ§, ν΄λΉ λμμ΄λ κ²°κ΄κ°μ μ ν©νμ§ μκ±°λ λΆκ°λ₯ν μλλ₯Ό ν κ²½μ° λ°μνλ μλ¬ (ex. true + 10 μ μ€νν΄λΌ / νΈμΆ μλͺ»νμ λ)
//calcNum(); function calcNum() { let sum = 0; // let sumμ μ ν¨λ²μ -> function calcNum() ν¨μ μ 체 // function calcNumμμ forλ¬Έμ΄ μμ΄μ let sumμ forλ¬Έ μμμλ μ ν¨ν¨ // let iμ μ ν¨λ²μ -> forλ¬Έ for (let i = 1; i <= 10; i++) { // sumμ μ ν¨λ²μλ ν¨μμ 체μ΄λ―λ‘ forλ¬ΈμμΌλ‘ λ€μ΄μ¬ μ μμ. sum += i; // sum = sum + i } console.log("sumμ : " + sum); //console.log("iλ : " + i); <- let iλ forλ¬Έμμλ§ μ ν¨ν¨ / 'Uncaught Reference Error: i is not defined' sum = 100; //μ¬ν λΉ console.log("μ¬ν λΉ : " + sum); /* Uncaught SyntaxError: Identifier 'sum' has already been declared (at var_let_const03.html:54:13) -> sumμ΄λΌλ λ³μλ μ΄μ μ μ μΈλμκΈ° λλ¬Έμ μ¬μ μΈλ μ μλ€. */ //let sum = 100; //μ¬μ μΈX } //νΈμ΄μ€ν var x = 10; function displayNumber() { console.log("xλ : " + x); // Uncaught ReferenceError: Cannot access 'y' before initialization at displayNumber ~. (yμ μΈλμ μμ) <- μ½μμ°½ λλ¬λ³΄λ©΄ μ΄λμμ€λ₯λ¬λμ§ μλ €μ€ //yλ₯Ό λ¨Όμ μ μΈνκ³ μ΄κΈ°ννκΈ° μ μλ ν΄λΉ λ³μλ₯Ό μ¬μ©ν μ μλ€. console.log("yλ : " + y); // μλκ° varμμΌλ©΄ 'undefined'μΈλ°, letμ΄λΌ μμ μ€λ₯λ¨ (νΈμ΄μ€ν x) let y = 20; } displayNumber();