Skip to content

Latest commit

Β 

History

History
142 lines (108 loc) Β· 4.49 KB

CoreJS_02.md

File metadata and controls

142 lines (108 loc) Β· 4.49 KB

[μ½”μ–΄μžλ°”μŠ€ν¬λ¦½νŠΈ] 02.μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλž€?

μ‹€ν–‰ν•  code에 μ œκ³΅ν•  ν™˜κ²½ 정보λ₯Ό λͺ¨μ•„놓은 객체

-> 동적 μ–Έμ–΄λ‘œμ„œμ˜ 성격 잘 νŒŒμ•…ν•  수 μžˆλ‹€.

Execution Contextκ°€ ν™œμ„±ν™” λ˜λŠ” μ‹œμ 

  1. ν˜Έμ΄μŠ€νŒ…: μ„ μ–Έλœ λ³€μˆ˜λ₯Ό λŒμ–΄ 올림
  2. μ™ΈλΆ€ ν™˜κ²½ 정보 ꡬ성
  3. this κ°’ μ„€μ •...

λ™μΌν•œ ν™˜κ²½μ— μžˆλŠ” μ½”λ“œλ“€μ„ μ‹€ν–‰ν•  λ•Œ ν•„μš”ν•œ ν™˜κ²½ 정보λ₯Ό λͺ¨μ•„ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•˜κ³ , 이λ₯Ό 콜 μŠ€νƒμ— μŒ“μ•„μ˜¬λ¦°λ‹€.

일반적으둜 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ κ΅¬μ„±λ˜λŠ” 방법은 ν•¨μˆ˜ 싀행이닀.

image

(좜처 - https://dev.to/ahmedtahir/what-is-the-execution-context-execution-stack-scope-chain-in-js-26nc)

무엇이 λ‹΄κΈΈκΉŒ?

image

Variable Environment

  • ν˜„μž¬ μ»¨ν…μŠ€νŠΈ λ‚΄μ˜ μ‹λ³„μžμ— λŒ€ν•œ 정보
  • μ™ΈλΆ€ ν™˜κ²½ 정보
  • μ„ μ–Έ μ‹œμ μ˜ Lexical Environment의 μŠ€λƒ…μƒ·(졜초 μ‹€ν–‰μ‹œμ˜) => 변경사항은 λ°˜μ˜λ˜μ§€ μ•ŠμŒ
    • μ‹€ν–‰ context 생성 μ‹œ, variable environment에 정보λ₯Ό μš°μ„ μ μœΌλ‘œ λ‹΄λŠ”λ‹€. κ·ΈλŒ€λ‘œ 볡사 ν›„ Lexical Environment 생성 λ’€, 이후엔 Lexical Environment λ₯Ό 주둜 ν™œμš©ν•œλ‹€.

Lexical Environment

ν˜„μž¬ context λ‚΄λΆ€μ—λŠ” a, b, c와 같은 μ‹λ³„μžκ°€ 있고, κ·Έ μ™ΈλΆ€ μ •λ³΄λŠ” Dλ₯Ό μ°Έμ‘°ν•˜κ²Œ λ˜μ–΄μžˆλ‹€

같이, 사전적인 λŠλ‚Œμ˜ 정보가 λ‹΄κ²¨μžˆλ‹€.

environment record와 ν˜Έμ΄μŠ€νŒ…

ν˜„μž¬ context와 κ΄€λ ¨λœ code의 μ‹λ³„μž(λ§€κ°œλ³€μˆ˜ 이름 / ν•¨μˆ˜ μ„ μ–Έ / λ³€μˆ˜λͺ…) λ‚΄μš© μ €μž₯.

  • μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€λ₯Ό μ²˜μŒλΆ€ν„° λκΉŒμ§€ μ­‰ ν›‘μœΌλ©° μˆœμ„œλŒ€λ‘œ μˆ˜μ§‘ν•œλ‹€.
function beforeHoisting (x) {
 console.log(`1) ${x}`);

 var x;
 console.log(`2) ${x}`)

 var x = 2;
 console.log(`3) ${x}`)
}

beforeHoisting(1);
console.log('=========')
// μ˜ˆμƒ? 1) x = 1, 2) x = undefined, 3) x = 2
// μ‹€μ œ? 1) x = 1, 2) x = 1, 3) x = 2

// λ§€κ°œλ³€μˆ˜λ₯Ό λ³€μˆ˜ μ„ μ–Έ/ν• λ‹Ήκ³Ό κ°™λ‹€κ³  κ°„μ£Όν•΄μ„œ λ³€ν™˜
function doingHoisting(x) {
 var x = 1;
 console.log(`1) ${x}`);

 var x;
 console.log(`2) ${x}`)

 var x = 2;
 console.log(`3) ${x}`)
}

doingHoisting(1);
console.log('=========')
function afterHoisting(x) {
 var x; // λ³€μˆ˜ x μ„ μ–Έκ³Ό μ €μž₯ν•  곡간 미리 확보. ν™•λ³΄ν•œ κ³΅κ°„μ˜ μ£Όμ†Ÿκ°’μ„ λ³€μˆ˜ x에 μ—°κ²°
 var x; // 이미 μ„ μ–Έλœ λ³€μˆ˜κ°€ μžˆμœΌλ―€λ‘œ λ¬΄μ‹œ
 var x;

 x = 1;
 console.log(`1) ${x}`);
 console.log(`2) ${x}`)
 x = 2;
 console.log(`3) ${x}`)
}
afterHoisting(1);
function beforeHoisting() {
  console.log(b);

  var b = 'bbb'; // μˆ˜μ§‘ λŒ€μƒ => λ³€μˆ˜ μ„ μ–Έ
  console.log(b);
  function b () {} // μˆ˜μ§‘ λŒ€μƒ => ν•¨μˆ˜ μ„ μ–Έ
}

beforeHoisting();
// ν•¨μˆ˜ μ‹€ν–‰ μˆœκ°„ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  λ³€μˆ˜λͺ…κ³Ό ν•¨μˆ˜ μ„ μ–Έμ˜ 정보λ₯Ό μœ„λ‘œ λŒμ–΄ μ˜¬λ¦°λ‹€.
// λ³€μˆ˜λŠ” 선언뢀와 ν• λ‹ΉλΆ€λ₯Ό λ‚˜λˆ„μ–΄ μ„ μ–ΈλΆ€λ§Œ λŒμ–΄μ˜¬λ¦¬μ§€λ§Œ, ν•¨μˆ˜ 선언은 ν•¨μˆ˜ 전체λ₯Ό λŒμ–΄μ˜¬λ¦°λ‹€.

function doingHoisting() {
  var b;
  function b() {}

  console.log(b);
  b = 'bbb';
  console.log(b);
  console.log(b); 
}

doingHoisting();

function afterHoisting() {
  var b; // λ³€μˆ˜ μ„ μ–Έ
  var b = function b() {} // 이미 μ„ μ–Έλœ λ³€μˆ˜κ°€ μžˆμœΌλ―€λ‘œ 선언은 λ¬΄μ‹œν•¨. ν•¨μˆ˜λŠ” λ³„λ„μ˜ λ©”λͺ¨λ¦¬μ— λ‹΄κΈΈ 것이고, ν•΄λ‹Ή ν•¨μˆ˜κ°€ μ €μž₯된 μ£Όμ†Ÿκ°’μ„ b와 μ—°κ²°λœ 곡간에 μ €μž₯. bλŠ” ν•¨μˆ˜λ₯Ό 가리킨닀

  console.log(b); // ν•¨μˆ˜ b 좜λ ₯
  b = 'bbb';
  console.log(b); // bbb 좜λ ₯
  console.log(b); 
}
afterHoisting();

ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν•¨μˆ˜ ν‘œν˜„μ‹

  • ν•¨μˆ˜ μ„ μ–Έλ¬Έ : function μ •μ˜λΆ€λ§Œ μ‘΄μž¬ν•˜κ³  λ³„λ„μ˜ ν• λ‹Ή λͺ…령이 μ—†μŒ / λ°˜λ“œμ‹œ ν•¨μˆ˜λͺ…이 μ •μ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€
  • ν•¨μˆ˜ ν‘œν˜„μ‹ : μ •μ˜ν•œ function을 λ³„λ„μ˜ λ³€μˆ˜μ— ν• λ‹Ή. / ν•¨μˆ˜λͺ…이 없어도 λœλ‹€.
// ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function a() { /* */ }
a(); // OK!

var b = function() { /* */ }
b(); // OK!

var c = function d() { /* */ }
c(); // ERROR!
d(); // ERROR!

μŠ€μ½”ν”„, μŠ€μ½”ν”„ 체인, outerEnvironmentReference

μŠ€μ½”ν”„

  • μ‹λ³„μžμ— λŒ€ν•œ μœ νš¨λ²”μœ„

μŠ€μ½”ν”„ 체인

  • μ‹λ³„μžμ˜ μœ νš¨λ²”μœ„(μŠ€μ½”ν”„)λ₯Ό μ•ˆμ—μ„œλΆ€ν„° λ°”κΉ₯으둜 μ°¨λ‘€λ‘œ κ²€μƒ‰ν•΄λ‚˜κ°€λŠ” 것
  • outerEnvironmentReference κ°€ κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.