μ΄μ μ Javascript μμμ this λ₯Ό λ€λ€λ κΈμμ μ κΉ "μ€ν 컨ν μ€νΈ"λ₯Ό μΈκΈνμλ€. Javascript μλ (κ·Έλ¦¬κ³ μλ§ λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄μλ) μ€ν 컨ν μ€νΈλΌλ κ°λ μ΄ μ‘΄μ¬νλλ°, μ΄λ₯Ό μ μ΄ν΄νκΈ° μν΄μλ μ°μ "μμ€μ½λ" μ κ°λ λΆν° μ΄ν΄ν΄μΌ νλ€.
β¨ μμ€μ½λ
ECMAScript λ μμ€μ½λλ₯Ό 4κ°μ§ νμ μΌλ‘ ꡬλΆνλ€. μμ€μ½λλ νμ λ§λ€ μ€ν 컨ν μ€νΈλ₯Ό μμ±νλ κ³Όμ κ³Ό κ΄λ¦¬ λ΄μ©μ΄ λ€λ₯΄λ©°, μ΄λ₯Ό κ°λ΅ν μμν λ΄μ©μ λ€μκ³Ό κ°λ€.
π μ μ μ½λ (Global code)
: μ μμ μ‘΄μ¬νλ μ½λ (ν¨μ, ν΄λμ€μ λ΄λΆ μ½λ λ―Έν¬ν¨)
1. μ μ μ€μ½ν (μ΅μμ μ€μ½ν) μμ±
2. μ μ κ°μ²΄μ μ°κ²°
3. var ν€μλλ‘ μ μΈλ μ μ λ³μ + μ μΈλ μ μ ν¨μλ₯Ό μ μ κ°μ²΄μ νλ‘νΌν°μ λ©μλλ‘ λ°μΈλ©
π ν¨μ μ½λ (Function code)
: ν¨μ λ΄λΆμ μ‘΄μ¬νλ μ½λ (μ€μ²© ν¨μ, ν΄λμ€μ λ΄λΆ μ½λ λ―Έν¬ν¨)
1. μ§μ μ€μ½ν μμ±
2. μ§μ μ€μ½νλ₯Ό μ μ μ€μ½νμμ μμνλ μ€μ½ν 체μΈμ μΌμμΌλ‘ μ°κ²°
3. μ§μ λ³μ, 맀κ°λ³μ, arguments κ°μ²΄ κ΄λ¦¬
π Eval μ½λ (Eval code)
: Eval ν¨μ (λΉνΈμΈ μ μ ν¨μ) μ μΈμλ‘ μ λ¬λμ΄ μ€νλλ μ½λ
1. strict mode μμ λ μμ μΈ μ€μ½ν μμ±
π λͺ¨λ μ½λ (Module code)
: λͺ¨λ λ΄λΆμ μ‘΄μ¬νλ μ½λ (ν¨μ, ν΄λμ€μ λ΄λΆ μ½λ λ―Έν¬ν¨)
1. λ 립μ μΈ λͺ¨λ μ€μ½ν μμ±
μμ€μ½λλ§λ€ μμ μ μ€μ½νλ₯Ό κ°μ₯ λ¨Όμ μμ±νλ κ²μ νμΈν μ μλ€. κ·Έλ¬λ μ€μ½νμ μμ±μ μν΄ μ°μ κ° μμ€μ½λκ° 'νκ°'λμ΄μΌ νλ€.
β¨ μμ€μ½λμ νκ°, μ€ν
μλ°μ€ν¬λ¦½νΈ μμ§μ μμ€μ½λλ₯Ό νκ°μ μ€νμ κ³Όμ μΌλ‘ λλμ΄ μ²λ¦¬νλ€.
1. νκ° κ³Όμ
- μ€ν 컨ν μ€νΈ μμ±
- λ³μ, ν¨μ (μ μΈλ¬Έ) λ¨Όμ μ€ν
- μμ±λ μλ³μλ₯Ό μ€ν 컨ν μ€νΈκ° κ΄λ¦¬νλ μ€μ½νμ λ±λ‘
2. μ€ν κ³Όμ
- νκ° μ΄ν μμ€μ½λκ° μμ°¨μ μΌλ‘ μ€ν (μ μΈλ¬Έ μ μΈ) === λ°νμ μμ
- μμ€μ½λ μ€νμ νμν μ 보λ (λ³μ λ±) μ€ν 컨ν μ€νΈκ° κ΄λ¦¬νλ μ€μ½νμμ κ²μν΄μ μ·¨λ
- μμ€μ½λμ μ€ν κ²°κ³Ό (λ³μκ° λ³κ²½ λ±)λ₯Ό μ€ν 컨ν μ€νΈκ° κ΄λ¦¬νλ μ€μ½νμ λ±λ‘
μλ₯Ό λ€μ΄, λ€μκ³Ό κ°μ μ½λκ° μλ€κ³ νμ.
var x;
x = 'hello';
1. μ°μ , JS μμ§μ μμ€μ½λλ₯Ό νκ°νλ€.
2. νκ° μ μ€ν 컨ν μ€νΈλ₯Ό μμ±νκ³ , μ μΈλ¬ΈμΈ var x; λ₯Ό μ€ννμ¬ μλ³μ x λ₯Ό μ€μ½νμ λ±λ‘νλ€.
3. μ΄λ x μ κ°μ undefined λ‘ μ΄κΈ°ν λλ€.
4. μ΄ν, μμ€μ½λλ μ€ν κ³Όμ μ λ€μ΄κ°λ©° μμ§ μ€νλμ§ μμ ν λΉλ¬Έ x = 'hello'; λ₯Ό μ€ννλ€.
5. μ΄λ μμ§μ x μ κ°μ ν λΉνκΈ° μν΄ x κ° μ΄λ―Έ μ€μ½νμ λ±λ‘λμλμ§ νμΈνλ€.
6. x κ° λ±λ‘ (μ μΈ) λ λ³μλΌλ©΄, ν λΉμ μ§ννλ©° κ·Έ κ²°κ³Όλ₯Ό λ μ€μ½νμ λ±λ‘νλ€.
7. μ€ν κ²°κ³Ό, x μ κ°μ 'undefined' μμ 'hello' λ‘ λ°λλ€.
π λ§μ½ λ€μκ³Ό κ°μ΄ μ μ μ½λμ ν¨μ μ½λλ‘ κ΅¬μ±λ μ½λλΌλ©΄ μ΄λ¨κΉ?
// κ°. μ μλ³μ μ μΈ
const x = 1;
// λ. ν¨μ μ μΈλ¬Έ
function foo(y) {
// λ€. μ§μλ³μ μ μΈ
const x = 2;
// λΌ. λ©μλ νΈμΆ
console.log(x + y); // 102
}
// λ§. ν¨μ νΈμΆ
foo(100);
// λ°. λ©μλ νΈμΆ
console.log(x + 100); // 101
μ μ½λλ λ¨κ³λ³λ‘ νκ° & μ€νλλ€.
1. μ μ μ½λ νκ°
- μ μΈλ¬Έ μ€ν (κ°, λ) & μ μ μ€μ½νμ λ±λ‘
2. μ μ μ½λ μ€ν
- λ°νμ μμ, μ μ μ½λ μμ°¨μ μ€ν, μ μ λ³μμ κ° ν λΉ, ν¨μ νΈμΆ (λ§)
- ν¨μ νΈμΆ μ μμ°¨μ μΌλ‘ μ€νλλ μ μ μ½λμ μ€νμ΄ μΌμ μ€λ¨λλ©°, ν¨μ λ΄λΆλ‘ μ§μ νλ€. (=== μ½λμ μ μ΄κΆμ΄ ν¨μ λ΄λΆλ‘ μ΄λνλ€)
3. ν¨μ μ½λ νκ°
- 맀κ°λ³μ, μ§μ λ³μ μ€ν (λ€), μ§μ μ€μ½νμ λ±λ‘
- this λ°μΈλ©λ κ²°μ
4. ν¨μ μ½λ μ€ν
- λ°νμ μμ, ν¨μ μ½λ μμ°¨μ μ€ν, 맀κ°/μ§μ λ³μμ κ° ν λΉ, console.log λ©μλ νΈμΆ
- console.log λ©μλ νΈμΆ μ μλ³μμΈ console μ μ€μ½ν 체μΈμ ν΅ν΄ κ²μνλ©°, μ΄λ₯Ό μν΄ ν¨μμ μ§μ μ€μ½νλ μμ μ€μ½ν (μ μ) κ³Ό μ°κ²°λμ΄ μμ΄μΌ νλ€. κ²μ κ²°κ³Ό, console μ μ€μ½ν 체μΈμ λ±λ‘λμ΄ μμ§ μμ λμ μ μ κ°μ²΄μ νλ‘νΌν°λ‘ μ‘΄μ¬ν κ²μ΄λ€.
- console κ°μ²΄μ νλ‘ν νμ 체μΈμ κ²μνμ¬ log νλ‘νΌν°λ₯Ό μ»λλ€.
- console.log λ©μλμ μΈμλ‘ μ λ¬λ ννμμ΄ (x + y) νκ°λλ©°, x μ y μ μλ³μλ μ€μ½ν 체μΈμ ν΅ν΄ κ²μνλ€.
- console.log λ©μλλ₯Ό μ€ννλ©°, μ’ λ£λλ©΄ ν¨μ μ½λ μ€ν μμ μ’ λ£λλ€.
5. μ μ μ½λ μ€ν
- μΌμ μ€λ¨λμλ μ μ μ½λμ μ€νμ΄ μ¬κ°λλ€.
βμ μ κ°μ²΄λ μ μ μ½λκ° νκ°λκΈ° μ΄μ μ μμ±λλ©°, μ΄ λ built-in μ μ νλ‘νΌν°, ν¨μ, κ°μ²΄κ° μΆκ°λλ€. μ μ κ°μ²΄λ Object.prototype λ₯Ό μμλ°λλ€.
β¨ μ€ν 컨ν μ€νΈ
μ€ν 컨ν μ€νΈλ, μμ μμμμ λ±μ₯ν μ€μ½ν, μλ³μ (λ³μ, ν¨μλͺ λ±), μ½λ μ€ν μμ λ±μ κ΄λ¦¬νλ μμμ΄λ€. μμ€μ½λλ₯Ό μ€ννλ λ° νμν νκ²½μ μ 곡νλ©°, μ½λμ μ€ν κ²°κ³Όλ₯Ό κ΄λ¦¬νλ μΌμ’ μ λ΄λΆ λ©μ»€λμ¦μ΄λ€. JS μ λͺ¨λ μ½λλ μ€ν 컨ν μ€νΈλ₯Ό ν΅ν΄ μ€νλλ©°, κ΄λ¦¬λλ€.
μ€ν 컨ν μ€νΈμλ λ μ컬 νκ²½κ³Ό μ€ν 컨ν μ€νΈ μ€νμ΄λΌλ λ κ°μ§ κ΅¬μ± μμκ° μ‘΄μ¬νλ€.
π μ€ν 컨ν μ€νΈ μ€ν
μ€ν 컨ν μ€νΈ μ€νμ νν μκ°νλ μ½ μ€ν (Call Stack) κ³Ό λμΌνλ€. μ΄ μ€νμ μ£Όμ μν μ λ°λ‘ μ½λμ μ€ν μμλ₯Ό κ΄λ¦¬νλ κ²μ΄λ€. μλ°μ€ν¬λ¦½νΈ μμ§μ μμ€μ½λλ₯Ό νκ°νλ©° μ€ν 컨ν μ€νΈλ₯Ό μμ±νλ€κ³ μΈκΈνμλλ°, μ΄λ μμ±λ 컨ν μ€νΈλ μ°¨λ‘λλ‘ μ€νμ μΆκ°λλ€. λν μ€νμ΄λΌλ μλ£κ΅¬μ‘°μ κ±Έλ§κ², LIFO ꡬ쑰 (μ μ νμΆ) λ©μ»€λμ¦μ κ°μ§κ³ μμ΄, λ¨Όμ μμ±λ 컨ν μ€νΈκ° μ μΌ λ§μ§λ§μ μ κ±°λλ€.
λ€μκ³Ό κ°μ μ½λλ μλ μ΄λ―Έμ§μ λμ€λ μ€ν 컨ν μ€νΈ μ€νμ μ μΆ ννμ μΌμΉνλ€.
const x = 1;
function foo () {
const y = 2;
function bar () {
const z = 3;
console.log(x + y + z);
}
bar();
}
foo();
μ€μν μ μ, μ€νμ μ΅μμμ μ‘΄μ¬νλ μ€ν 컨ν μ€νΈλ μΈμ λ νμ¬ μ€ν μ€μΈ μ½λμ μ€ν 컨ν μ€νΈλΌλ μ μ΄λ€. λ°λΌμ μ΅μμμ μ€ν 컨ν μ€νΈλ running execution context (μ€ν μ€μΈ μ±ν 컨ν μ€λ) λ‘ λΆλ¦°λ€.
π λ μ컬 νκ²½
λ μ컬 νκ²½ μμ μλ£κ΅¬μ‘°μ΄λ©°, μλ³μμ μλ³μμ λ°μΈλ©λ κ°, κ·Έλ¦¬κ³ μμ μ€μ½νμ λν μ°Έμ‘°λ₯Ό κΈ°λ‘νλ€. λ μ컬 νκ²½μ μ€μ½νμ μλ³μλ₯Ό κ΄λ¦¬νλ μν μ λ΄λΉνλ€. νΉλ³ν μ μ ν€λ‘ μλ³μλ₯Ό λ±λ‘νκ³ κ°μ λ°μΈλ©λ κ°μ λ±λ‘νμ¬ κ°μ²΄ ννμ μ€μ½νλ₯Ό μμ±νλ€. (μ¦, λ μ컬 νκ²½ μμ νλμ κ°μ²΄λΌλ μλ―Έμ΄λ€)
β μ¬μ€ μ€ν 컨ν μ€νΈλ λ μ컬 νκ²½ λ§κ³ Variable Environment λΌλ λ νλμ μ»΄ν¬λνΈλ‘ ꡬμ±λμ΄ μμΌλ, νΉλ³ν κ²½μ°κ° μλ μ΄μ (try/catch, eval λ±) λμ λ΄μ©μ λ¬λΌμ§μ§ μλλ€. λ°λΌμ μ΄ κΈμμλ Variable Environment μ λν μ€λͺ μ λ°λ‘ νμ§ μλλ€.
λ μ컬 νκ²½μ νκ²½ λ μ½λ (Environment Record) μ μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘° (Outer Lexical Environment Reference) λΌλ λ κ°μ μ»΄ν¬λνΈλ‘ ꡬμ±λλ€.
νκ²½ λ μ½λ (Environment Record)
- μ€μ½νμ ν¬ν¨λ μλ³μ λ±λ‘
- μλ³μμ λ°μΈλ©λ κ° κ΄λ¦¬
μΈλΆ λ μ컬 νκ²½μ λν μ°Έμ‘° (Outer Lexical Environment Reference)
- μμ μ€μ½ν. μ¦, ν΄λΉ μ€ν 컨ν μ€νΈλ₯Ό μμ±ν μμ€μ½λλ₯Ό ν¬ν¨νλ μμ μ½λμ λ μ컬 νκ²½
μμ§μ΄ λ μ컬 νκ²½μμ μλ³μλ₯Ό κ²μνλ κ³Όμ μμ λ§€μ° κ΅¬μ²΄μ μ΄κ³ μΈλΆνλ λ©μ»€λμ¦μ λ°λ₯Έλ€. μ΄ λΆλΆμ λν΄μλ λ€μ κΈμμ μμΈν μμ νκ³ μ νλ€.
βμ λ΄μ©μ μ’ ν©νμ¬ μ€ν 컨ν μ€νΈκ° μμ±λλ μμλ₯Ό μ 리νλ©΄ λ€μκ³Ό κ°λ€.
0. μ μ κ°μ²΄ μμ±
1. μ μ μ€ν 컨ν μ€νΈ μμ±
2. μ μ λ μ컬 νκ²½ μμ±
- μ μ μ€ν 컨ν μ€νΈμ λ°μΈλ©
3. μ μ νκ²½ λ μ½λ μμ±
- built-in κ°μ²΄ λ° μ μ μ€μ½ν μ 곡
3-1. κ°μ²΄ νκ²½ λ μ½λ μμ±
- bindingobject μ μ°κ²° (0 μμ μμ±λ μ μ κ°μ²΄: μ¬κΈ°μ λ±λ‘νλ©΄ μ΄ν 체μ΄λμ ν΅ν΄ κ²μ κ°λ₯)
- var ν€μλλ‘ μ μΈν μ μ λ³μ (window.x λ‘ μ°Έμ‘° κ°λ₯)
- ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν μ μ ν¨μ
3-2. μ μΈ νκ²½ λ μ½λ μμ±
- let, const ν€μλλ‘ μ μΈν μ μ λ³μ (μ μ κ°μ²΄μ νλ‘νΌν°κ° μλ λΈλ‘ λ΄μ μ‘΄μ¬, window.x λ‘ μ°Έμ‘° λΆκ°λ₯)
4. this λ°μΈλ©
5. λ μ컬 νκ²½μ λν μ°Έμ‘° κ²°μ
- μ μ μ½λλ₯Ό ν¬ν¨νλ μμ€μ½λλ μμΌλ―λ‘ μ μ λ μ컬 νκ²½μ μ°Έμ‘°κ°μ null μ΄λ€. (μ€μ½ν 체μΈμ μ’ μ )
6. μ μ μ½λ μ€ν
- μλ³μλ₯Ό κ²μν λλ μ€ν μ€μΈ μ€ν 컨ν μ€νΈμμ κ²μ
- κ²μν μ μμΌλ©΄ λ μ컬 νκ²½ (μμ μ€μ½ν)λ‘ μ΄λνμ¬ κ²μ
- λ μ컬 νκ²½μ μ°Έμ‘°κ°μ΄ null μΌ λ μλ μλ³μλ₯Ό κ²μνλ©΄ Reference Error (μ°Έμ‘° μλ¬) λ°μ --> μλ³μ κ²°μ μ μ€ν¨
π‘ μ°Έκ³ ) μ μ κ°μ²΄μ κ΄λ ¨νμ¬: var, let, const μ μ°¨μ΄
var
- var ν€μλλ‘ μ μΈν μ μ λ³μλ μ μ κ°μ²΄μ νλ‘νΌν°κ° λ¨, window.x λ‘ μ°Έμ‘° κ°λ₯
- μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³ λμμ μ§ν (νκ° μμ μ μ μ κ°μ²΄(Binding Object)μ λ±λ‘, undefined λ°μΈλ©)
- λ°λΌμ νΈμ΄μ€ν κ°λ₯ (μ½λ μ€ν λ¨κ³μμ, λ³μ μ μΈλ¬Έ μ€ν μ μ μ°Έμ‘° κ°λ₯. but, κ°μ undefined μ)
- ν¨μ μ μΈλ¬Έμ΄ νΈμ΄μ€ν κ°λ₯ν μ΄μ μ΄κΈ°λ ν¨ (but ν¨μμ κ²½μ° νκ° λ¨κ³μμ undefined κ° μλ ν¨μ κ°μ²΄λ₯Ό λ±λ‘ν¨. μ΄μ μμ λ³μμλ μ°¨μ΄κ° μμ)
let, const
- let, const ν€μλλ‘ μ μΈν μ μ λ³μλ μ μ κ°μ²΄μ νλ‘νΌν°κ° μλ λΈλ‘ (μ€μ½ν) λ΄μ μ‘΄μ¬ν¨, window.x λ‘ μ°Έμ‘° λΆκ°λ₯
- μ μΈ λ¨κ³μ μ΄κΈ°ν λ¨κ³ λΆλ¦¬λ¨. μ΄κΈ°ν λ¨κ³ (λ°νμμ΄ μ€νλμ΄ μ½λλ₯Ό λ§λλ λ¨κ³) λ₯Ό λ§λκΈ° μ κΉμ§λ μΌμμ μ¬κ°μ§λμ λΉ μ§
- νκ° λ¨κ³μμ λ³μκ° μ μ κ°μ²΄κ° μλ "νκ²½ λ μ½λ(Declarative Environment Record)" μ λ±λ‘λλ, undefined κ° μλ <uninitialize> κ° λ°μΈλ©λ¨ --> μ΄κΈ°νκ° λμ§ μμ λ³μμ μ κ·Όν μ μλ€λ μλ―Έ (μ°Έμ‘°ν μ μλ€λ μλ―Έ)
- μ€μ κ°μ΄ ν λΉλλ μ½λλ₯Ό λ§λκΈ° μ κΉμ§λ μ¬μ© λΆκ° (νΈμ΄μ€ν λΆκ°)
β¨ μμ½
μλ°μ€ν¬λ¦½νΈ μμ€μ½λλ μ€ν 컨ν μ€νΈμ λ°λΌ λ€λ₯Έ μ€μ½νλ₯Ό κ°μ§λ©°, λ€λ₯Έ νμ μΌλ‘ λΆλ₯λλ€. μ€ν 컨ν μ€νΈλ μμ€μ½λκ° μ€νλκΈ° μν΄ νμν νκ²½μ΄λ©°, μ€μ½νλ μ€ν μ€μΈ 컨ν μ€νΈμ μ ν¨ν λ²μμ΄λ€.
β¨ μ°Έκ³ μλ£
- JavaScript - μλ°μ€ν¬λ¦½νΈ μ€ν 컨ν μ€νΈ, μ€μ½ν(Scope), μ€μ½ν 체μΈ
- λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive (μν€λΆμ€)
- μλ°μ€ν¬λ¦½νΈ - μ€ν 컨ν μ€νΈμ μ€μ½ν
'π» DEV > Javascript & NodeJS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Javascript] Iterable (μ΄ν°λ¬λΈ) (0) | 2021.10.13 |
---|---|
[Javascript] ν΄λ‘μ (Closure) (0) | 2021.10.06 |
[NodeJS] Node μ this λ? (+ νμ΄ν ν¨μμ this) (2) | 2021.09.10 |
[Javascript] Javascript μ this λ? (0) | 2021.09.07 |
[Javascript] μ΄λ²€νΈ 루ν (Event Loop) λ? (0) | 2021.09.07 |
λκΈ