μ€νν codeμ μ 곡ν νκ²½ μ 보λ₯Ό λͺ¨μλμ κ°μ²΄
-> λμ μΈμ΄λ‘μμ μ±κ²© μ νμ ν μ μλ€.
Execution Contextκ° νμ±ν λλ μμ
- νΈμ΄μ€ν : μ μΈλ λ³μλ₯Ό λμ΄ μ¬λ¦Ό
- μΈλΆ νκ²½ μ 보 ꡬμ±
- this κ° μ€μ ...
λμΌν νκ²½μ μλ μ½λλ€μ μ€νν λ νμν νκ²½ μ 보λ₯Ό λͺ¨μ 컨ν
μ€νΈλ₯Ό ꡬμ±νκ³ , μ΄λ₯Ό μ½ μ€ν
μ μμμ¬λ¦°λ€.
μΌλ°μ μΌλ‘ μ€ν 컨ν μ€νΈκ° ꡬμ±λλ λ°©λ²μ ν¨μ μ€νμ΄λ€.
(μΆμ² - https://dev.to/ahmedtahir/what-is-the-execution-context-execution-stack-scope-chain-in-js-26nc)
- νμ¬ μ»¨ν μ€νΈ λ΄μ μλ³μμ λν μ 보
- μΈλΆ νκ²½ μ 보
- μ μΈ μμ μ
Lexical Environment
μ μ€λ μ·(μ΅μ΄ μ€νμμ) => λ³κ²½μ¬νμ λ°μλμ§ μμ- μ€ν context μμ± μ, variable environmentμ μ 보λ₯Ό μ°μ μ μΌλ‘ λ΄λλ€. κ·Έλλ‘ λ³΅μ¬ ν Lexical Environment μμ± λ€, μ΄νμ Lexical Environment λ₯Ό μ£Όλ‘ νμ©νλ€.
νμ¬ context λ΄λΆμλ a, b, cμ κ°μ μλ³μκ° μκ³ , κ·Έ μΈλΆ μ 보λ Dλ₯Ό μ°Έμ‘°νκ² λμ΄μλ€
κ°μ΄, μ¬μ μ μΈ λλμ μ λ³΄κ° λ΄κ²¨μλ€.
νμ¬ 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
κ° κ°λ₯νκ² νλ€.