관리 메뉴

eazyseon

13μž₯ μŠ€μ½”ν”„ λ³Έλ¬Έ

πŸ“•μ±…/λ”₯λ‹€μ΄λΈŒ

13μž₯ μŠ€μ½”ν”„

eazyseon 2023. 11. 20. 23:10
λ°˜μ‘ν˜•

13.1 μŠ€μ½”ν”„λž€? 

function add (x,y) {
  console.log(x,y) //2 5
  return x + y;
}

add(2,5);

console.log(x,y); //ReferenceError: x is not defined

 

 

var var1 = 1;

if (true) {
  var var2 = 2;
  if (true) {
    var var3 = 3;
  }
}

function foo() {
  var var4 = 4;
  function bar() {
    var var5 = 5;
  }
}

console.log(var1); //1
console.log(var2); //2
console.log(var3); //3
console.log(var4); //ReferenceError: var4 is not defined
console.log(var5); //ReferenceError: var5 is not defined

 

λͺ¨λ“  μ‹λ³„μžλŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„κ°€ κ²°μ •λœλ‹€. 

μŠ€μ½”ν”„λ₯Ό μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λ§ν•œλ‹€. 

 

var x = 'global';

function foo() {
  var x = 'local';
  console.log(x) //local
}

foo();

console.log(x) //global

 

ν•¨μˆ˜ λ‚΄λΆ€μ˜ xλŠ” λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°ν•  수 있고 μ™ΈλΆ€λŠ” xλŠ” μ–΄λ””μ„œλ“  μ°Έμ‘°ν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„λ₯Ό 톡해 μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Όν•  것인지 κ²°μ •ν•œλ‹€. λ”°λΌμ„œ μŠ€μ½”ν”„λŠ” μ‹λ³„μžλ₯Ό 검색할 λ•Œ μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ΄λΌκ³ λ„ ν•  수 μžˆλ‹€. 

 

13.2 μŠ€μ½”ν”„μ˜ μ’…λ₯˜ 

μ „μ—­ - μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­

μ§€μ—­ - ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€

var x = "global x";
var y = "global y";

function outer() {
  var z = "outer's local z";

  console.log(x); //"global x"
  console.log(y); //"global y"
  console.log(z); //"outer's local z"

  function inner() {
    var x = "inner's local x";

    console.log(x);// 1) "inner's local x"
    console.log(y);// 2) "global y"
    console.log(z);// 3) "outer's local z"
  }
  inner();
}

outer();

console.log(x);//"global x"
console.log(z);//ReferenceError: z is not defined

 

μ§€μ—­μ΄λž€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ₯Ό λ§ν•˜λ©° μ§€μ—­ λ³€μˆ˜λŠ” μžμ‹ μ˜ μ§€μ—­ μŠ€μ½”ν”„μ™€ ν•˜μœ„ μ§€μ—­ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•˜λ‹€. 

inner ν•¨μˆ˜ 내뢀에 μ„ μ–Έλœ x λ³€μˆ˜ 이외에 이름이 같은 μ „μ—­ λ³€μˆ˜ xκ°€ μ‘΄μž¬ν•œλ‹€. inner ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ x λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ μ „μ—­ λ³€μˆ˜ xκ°€ μ•„λ‹Œ 

μ§€μ—­ λ³€μˆ˜ xλ₯Ό μ°Έμ‘°ν•œλ‹€. μ™œ? μŠ€μ½”ν”„ 체인을 톡해 λ³€μˆ˜λ₯Ό κ²€μƒ‰ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€. 

 

13.3 μŠ€μ½”ν”„ 체인

ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜κ°€ μ •μ˜λœ 것을 'ν•¨μˆ˜μ˜ 쀑첩'이라 ν•œλ‹€. 

쀑첩 ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„λŠ” 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„μ™€ 계측적 ꡬ쑰λ₯Ό κ°–λŠ”λ‹€. μ™ΈλΆ€ ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„λ₯Ό 쀑첩 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λΌ ν•œλ‹€. 

 

μŠ€μ½”ν”„κ°€ κ³„μΈ΅μ μœΌλ‘œ μ—°κ²°λœ 것을 μŠ€μ½”ν”„ 체인이라고 ν•œλ‹€. 

λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  λ•Œ μŠ€μ½”ν”„ 체인을 톡해 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜μ—¬ μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯으둜 μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜λ₯Ό κ²€μƒ‰ν•œλ‹€. 

 

- μŠ€μ½”ν”„ 체인에 μ˜ν•œ λ³€μˆ˜ 검색 (μœ„ μ½”λ“œ μ°Έκ³ )

1) inner ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„μ—μ„œ x λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλŠ”μ§€ κ²€μƒ‰ν•œλ‹€. inner ν•¨μˆ˜ λ‚΄μ—λŠ” x λ³€μˆ˜κ°€ μ‘΄μž¬ν•˜λ―€λ‘œ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜κ³  검색을 μ’…λ£Œ

2) inner ν•¨μˆ˜μ˜ y λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλŠ”μ§€ κ²€μƒ‰ν•œλ‹€. > μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. > outer ν•¨μˆ˜μ— μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜μ§€λ§Œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.>

  μ „μ—­μŠ€μ½”ν”„μ— y λ³€μˆ˜κ°€ μ‘΄μž¬ν•˜λ―€λ‘œ μ°Έμ‘°ν•˜κ³  μ’…λ£Œν•œλ‹€. 

3) inner ν•¨μˆ˜μ˜ z λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλŠ”μ§€ κ²€μƒ‰ν•œλ‹€. > μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. > outer ν•¨μˆ˜μ— μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.> λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜κ³  μ’…λ£Œν•œλ‹€. 

 

μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λŠ” ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ 자유둭게 μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ,

ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ μœ μš”ν•œ λ³€μˆ˜λ₯Ό μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μ°Έμ‘°ν•  수 μ—†λ‹€. 

 

13.4 ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ λΈ”λ‘λ§Œμ„ μ§€μ—­ μŠ€μ½”ν”„λ‘œ μΈμ •ν•œλ‹€. 이것을 ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λΌ ν•œλ‹€. 

var x = 1;

if(true){
  var x = 10;
}

console.log(x);//10

 

ν•¨μˆ˜ λ°–μ—μ„œ varν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έλ˜μ—ˆλ‹€ 할지라고 λͺ¨λ‘ μ „μ—­ λ³€μˆ˜λ‹€. 

var x = 100;

for(var i = 0; i < 5; i++){
  console.log(i)//0 1 2 3 4
}

console.log(i)//5

 

λ§ˆμ°¬κ°€μ§€λ‘œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 블둝 레벨 μŠ€μ½”ν”„λ₯Ό μΈμ •ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— iλŠ” μ „μ—­ λ³€μˆ˜κ°€ λœλ‹€. 

 

13.5 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

var x = 1;

function foo(){
  var x = 10;
  bar();
}

function bar() {
  console.log(x)
}

foo();
bar();

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€. 

 

μœ„ 예제의 bar ν•¨μˆ˜λŠ” μ „μ—­μ—μ„œ μ •μ˜λœ ν•¨μˆ˜λ‹€. 즉, μžμ‹ μ΄ μ •μ˜λœ μ „μ—­ μŠ€μ½”ν”„λ₯Ό μƒμœ„ μŠ€μ½”ν”„λ‘œ μ‚¬μš©ν•œλ‹€.

λ”°λΌμ„œ μ „μ—­ λ³€μˆ˜ x의 κ°’ 1을 두 번 좜λ ₯ν•œλ‹€. 

λ°˜μ‘ν˜•
Comments