λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive λμμ 23μ₯μ μ 리νμμ΅λλ€.
λ μ컬 νκ²½μ μλ³μμ μλ³μμ λ°μΈλ© λ κ°, κ·Έλ¦¬κ³ μμ μ€μ½νμ λν μ°Έμ‘°λ₯Ό κΈ°λ‘νλ μλ£κ΅¬μ‘°λ‘ μ€ν 컨ν μ€νΈλ₯Ό ꡬμ±νλ μ»΄ν¬λνΈλ€.
μ€ν 컨ν μ€νΈλ LexicalEnvironment μ»΄ν¬λνΈμ VariableEnvironment μ»΄ν¬λνΈλ‘ ꡬμ±λλ€. μ¬κΈ°μ μ΄ λ μ»΄ν¬λνΈλ νλμ λμΌν λ μ컬 νκ²½μ μ°Έμ‘°νλ€.
λ μ컬 νκ²½μ κ΅¬μ± μ»΄ν¬λνΈ
1. νκ²½ λ μ½λ
μ€μ½νμ ν¬ν¨λ μλ³μλ₯Ό λ±λ‘νκ³ λ±λ‘λ μλ³μμ λ°μΈλ© λ κ°μ κ΄λ¦¬νλ μ μ₯μλ€. νκ²½ λ μ½λλ μμ€μ½λ νμ
μ λ°λΌ κ΄λ¦¬νλ λ΄μ©μ μ°¨μ΄κ° μλ€.
2. μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘°
μμ μ€μ½νλ₯Ό κ°λ¦¬ν¨λ€. μΈλΆ λ μ컬 νκ²½, μ¦ ν΄λΉ μ€ν 컨ν
μ€νΈλ₯Ό μμ±ν μμ€μ½λλ₯Ό ν¬ν¨νλ μμ μ½λμ λ μ컬 νκ²½μ λ§νλ€.
μ μ κ°μ²΄λ μ μ μ½λκ° νκ°λκΈ° μ΄μ μ μμ±λλ€. μ μ κ°μ²΄λ νλ‘ν νμ 체μΈμ μΌμμ΄λ€.
// 23-05
window.toString();
window.__proto__.__proto__.proto__.__proto__ === Object.prototype; //true
μμ€μ½λκ° λ‘λ λλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ μ μ μ½λλ₯Ό νκ°νλ€.
λΉμ΄μλ μ μ 컨ν μ€νΈλ₯Ό μμ±νμ¬ μ€ν 컨ν μ€νΈ μ€νμ νΈμνλ€.
μ μ λ μ컬 νκ²½μ μμ±νκ³ μ μ μ€ν 컨ν μ€νΈμ λ°μΈλ©νλ€.
μ μ νκ²½ λ μ½λλ κ°μ²΄ νκ²½ λ μ½λμ μ μΈμ νκ²½ λ μ½λλ‘ κ΅¬μ±λμ΄ μλ€.
κ°μ²΄ νκ²½ λ μ½λ : varν€μλλ‘ μ μΈν μ μ λ³μμ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν μ μ ν¨μ, λΉνΈμΈ μ μ νλ‘νΌν°μ λΉνΈμΈ μ μ ν¨μ, νμ€ λΉνΈμΈ κ°μ²΄λ₯Ό κ΄λ¦¬
μ μΈμ νκ²½ λ μ½λ : let, constν€μλλ‘ μ μΈν μ μ λ³μ κ΄λ¦¬
μ μ μ½λ νκ°μμ varν€μλλ‘ μ μΈν μ μ λ³μμ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μλ μ μ ν¨μλ μ μ νκ²½ λ μ½λμ κ°μ²΄ νκ²½ λ μ½λμ μ°κ²°λ BindingObjectλ₯Ό ν΅ν΄ μ μ κ°μ²΄μ νλ‘νΌν°μ λ©μλκ° λλ€. μ΄λ λ±λ‘λ μλ³μλ₯Ό μ μ νκ²½ λ μ½λμ κ°μ²΄ νκ²½ λ μ½λμμ κ²μνλ©΄ μ μ κ°μ²΄μ νλ‘νΌν°λ₯Ό κ²μνμ¬ λ°ννλ€.
λ°λΌμ var ν€μλλ‘ μ μΈν λ³μλ μ½λ μ€ν λ¨κ³μμ λ³μ μ μΈλ¬Έ μ΄μ μλ μ°Έμ‘°ν μ μλ€. λ¨, λ³μ μ μΈλ¬Έ μ΄μ μ μ°Έμ‘°ν λ³μμ κ°μ μΈμ λ undefinedμ΄λ€.
ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν ν¨μκ° νκ°λλ©΄ μ μκ°μ²΄μ ν€λ‘ λ±λ‘νκ³ μμ±λ ν¨μ κ°μ²΄λ₯Ό μ¦μ ν λΉνλ€. μ¬κΈ°μ ν¨μ νΈμ΄μ€ν μ΄ μΌμ΄λ ν¨μ μ μΈλ¬Έ μ΄μ μ νΈμΆν μ μλ€.
let, const ν€μλλ‘ μ μΈν μ μ λ³μλ μ μΈμ νκ²½ λ μ½λμ λ±λ‘λκ³ κ΄λ¦¬λλ€.
μ μ νκ²½ λ μ½λμ [[GlobalThisValue]] λ΄λΆ μ¬λ‘―μ thisκ° λ°μΈλ©λλ€. μ μ μ½λμμ thisλ₯Ό μ°Έμ‘°νλ©΄ μ μ νκ²½ λ μ½λμ [[GlobalThisValue]] λ΄λΆ μ¬λ‘―μ λ°μΈλ© λμ΄μλ κ°μ²΄κ° λ°νλλ€.
μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘°λ νμ¬ νκ° μ€μΈ μμ€μ½λλ₯Ό ν¬ν¨νλ μΈλΆ μμ€μ½λμ λ μ컬 νκ²½, μ¦ μμ μ€μ½νλ₯Ό κ°λ¦¬ν¨λ€.
var x = 1;
const y = 2;
function foo (a) {
var x = 3;
const y = 4;
function bar (b) {
const z = 5;
console.log(a + b + x + y + z);
}
bar(10);
}
foo(20);
μ μ μ½λκ° μμ°¨μ μΌλ‘ μ€νλκΈ° μμνλ€. λ³μ ν λΉλ¬Έμ΄ μ€νλμ΄ μ μ λ³μ x, yμ κ°μ΄ ν λΉλλ€.
μλ³μ κ²°μ
λ³μ ν λΉλ¬Έ λλ ν¨μ νΈμΆλ¬Έμ μ€ννλ €λ©΄ λ¨Όμ λ³μ λλ ν¨μ μ΄λ¦μ΄ μ μΈλ μλ³μμΈμ§ νμΈν΄μΌ νλ€. λν μλ³μλ μ€μ½νκ° λ€λ₯΄λ©΄ κ°μ μ΄λ¦μ κ°μ§ μ μκΈ° λλ¬Έμ λμΌν μ΄λ¦μ μλ³μμΈ κ²½μ° μ΄λ μ€μ½νμ μλ³μλ₯Ό μ°Έμ‘°νλ©΄ λλμ§ κ²°μ ν νμκ° μλ€. μ΄λ₯Ό μλ³μ κ²°μ μ΄λΌ νλ€.
μλ³μλ₯Ό κ²μν λλ μν μ€μΈ μ€ν 컨ν
μ€νΈμμ μλ³μλ₯Ό κ²μνκΈ° μμνλ€.
foo ν¨μκ° νΈμΆλλ©΄ μ μ μ½λμ μ€νμ μΌμ μ€λ¨νκ³ fooν¨μ λ΄λΆλ‘ μ½λμ μ μ΄κΆμ΄ μ΄λνλ€. κ·Έλ¦¬κ³ ν¨μ μ½λλ₯Ό νκ°νκΈ° μμνλ€.
foo ν¨μ μ€ν 컨ν μ€νΈλ₯Ό μμ±νλ€. μμ±λ ν¨μ μ€ν 컨ν μ€νΈλ ν¨μ λ μ컬 νκ²½μ΄ μμ±λ λ€μ μ€ν 컨ν μ€νΈ μ€νμ νΈμλλ€.
fooν¨μ λ μ컬 νκ²½μ μμ±νκ³ foo ν¨μ μ€ν 컨ν μ€νΈμ λ°μΈλ©νλ€.
ν¨μ νκ²½ λ μ½λλ λ§€κ°λ³μ, aruguments κ°μ²΄, ν¨μ λ΄λΆμμ μ μΈν μ§μ λ³μμ μ€μ²© ν¨μλ₯Ό λ±λ‘νκ³ κ΄λ¦¬νλ€.
ν¨μ νκ²½ λ μ½λμ [[ThisValue]] λ΄λΆ μ¬λ‘―μ thisκ° λ°μΈλ©λλ€.
foo ν¨μλ μΌλ° ν¨μλ‘ νΈμΆλμμΌλ― thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€. λ°λΌμ ν¨μ νκ²½ λ μ½λμ [[ThisValue]] λ΄λΆ μ¬λ‘―μλ μ μ κ°μ²΄κ° λ°μΈλ©λλ€.
μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘°μ foo ν¨μ μ μκ° νκ°λ μμ μ μ€ν μ€μΈ μ€ν 컨ν μ€νΈμ λ μ컬 νκ²½μ μ°Έμ‘°κ° ν λΉλλ€.
*λ μ컬 μ€μ½νμμ ν¨μλ₯Ό μ΄λμ νΈμΆνλμ§κ° μλλΌ μ΄λμ μ μνλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ νλ€.
fooν¨μμ μμ€μ½λκ° μμ°¨μ μΌλ‘ μ€νλκΈ° μμνλ€. λ§€κ°λ³μμ μΈμκ° ν λΉλκ³ , λ³μ ν λΉλ¬Έμ΄ μ€νλμ΄ μ§μ λ³μ x, yμ κ°μ΄ ν λΉλλ€. κ·Έλ¦¬κ³ barκ° νΈμΆλλ€.
μλ³μ κ²°μ μ μν΄ μ€ν μ€μΈ μ€ν 컨ν μ€νΈμ λ μ컬 νκ²½μμ μλ³μλ₯Ό κ²μνκΈ° μμνλ€. νμ¬ μ€ν μ€μΈ μ€ν 컨ν μ€λ foo ν¨μ μ€ν 컨ν μ€νΈμ΄λ―λ‘ foo ν¨μ λ μ컬 νκ²½μμ μλ³μ x, yλ₯Ό κ²μνκΈ° μμνλ€.
bar ν¨μκ° νΈμΆλλ©΄ bar ν¨μ λ΄λΆλ‘ μ½λμ μ μ΄κΆμ΄ μ΄λνλ€. κ·Έλ¦¬κ³ bar ν¨μ μ½λλ₯Ό νκ°νκΈ° μμνλ€.
λ§€κ°λ³μμ μΈμκ° ν λΉλκ³ , λ³μ ν λΉλ¬Έμ΄ μ€νλμ΄ μ§μ λ³μ zμ κ°μ΄ ν λΉλλ€. κ·Έλ¦¬κ³ console.logκ° μ€νλλ€.
console μλ³μλ₯Ό μ€μ½ν 체μΈμμ κ²μ
: bar ν¨μ => foo ν¨μ => μ μ λ μ컬 νκ²½
console κ°μ²΄μμ log λ©μλλ₯Ό κ²μ, μ΄λλ νλ‘ν νμ 체μΈμ ν΅ν΄ λ©μλλ₯Ό κ²μνλ€. log λ©μλλ μμλ νλ‘νΌν°λΌ μλλΌ console κ°μ²΄κ° μ§μ μμ νλ νλ‘νΌν°λ€.
a, b, x, y, z μλ³μλ₯Ό κ²μνλ€.
μμ±λ κ°μ console.log λ©μλμ μ λ¬νμ¬ νΈμΆνλ€.
μ€ν 컨ν μ€νΈ μ€νμμ bar μ€ν 컨ν μ€νΈκ° μ κ±°λκ³ foo μ€ν 컨ν μ€νΈκ° μ€ν μ€μ΄ λλ€. λ€λ§ μ€ν 컨ν μ€νΈκ° μ κ±°λμλ€κ³ λ μ컬 νκ²½κΉμ§ μλ©Έλλ κ²μ μλλ€.
μ€ν 컨ν μ€νΈ μ€νμμ foo μ€ν 컨ν μ€νΈκ° μ κ±°λκ³ μ μ μ€ν 컨ν μ€νΈκ° μ€ν μ€μ΄ λλ€.
μ 체μ μΈ μ½λ μ€ν νλ¦μ μκ²λμλ€. μ°μ console μλ³μλ₯Ό κ²μνλ€λ κ²λ μ²μ μΈμ§νκ² λμλ€. μ½λκ° μ΄λ€ νμμΌλ‘ νκ°λκ³ μ€νλλμ§ μ€λͺ μ λ°λΌκ°λ€λ³΄λ μμ μ΄ν΄λμλ€.
Ref
- μ΄μ λͺ¨ μ , βλͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Diveβ, μν€λΆμ€