5. μ€ν 컨ν μ€νΈμ ν΄λ‘μ
μ΄ κΈμ κ³ νμ€, μ‘νμ£Ό λμ μΈμ¬μ΄λ μλ°μ€ν¬λ¦½νΈλ₯Όμ°Έμ‘°νμ¬ μμ±ν κΈμ λλ€.
#
μ€ν 컨ν μ€νΈ κ°λ λ€λ₯Έ μΈμ΄μ μ½ μ€ν(call stack) κ°λ κ³Ό μ μ¬ν κ°λ
μ½ μ€ν(call stack) : ν¨μλ₯Ό νΈμΆν λ ν΄λΉ ν¨μμ νΈμΆ μ 보(ν¨μ λ΄ μ§μ λ³μνΉμ μΈμκ° λ±)κ° μμ¬μλ μ€ν
ECMAScriptμμλ μ€ν 컨ν μ€νΈλ₯Ό "μ€ν κ°λ₯ν μ½λλ₯Ό νμννκ³ κ΅¬λΆνλ μΆμμ μΈ κ°λ " μΌλ‘ κΈ°μ νκ³ , μ΄λ₯Ό μ½ μ€νκ³Ό μ°κ΄μ§μ΄ μ μνλ©΄ "μ€ν κ°λ₯ν μλ°μ€ν¬λ¦½νΈ μ½λ λΈλ‘μ΄ μ€νλλ νκ²½" μ΄λΌκ³ ν μ μλ€.
μ¬κΈ°μ λ§νλ μ½λ λΈλ‘μ λλΆλΆμ κ²½μ° ν¨μμ΄λ€.
ECMAScriptμμλ μ€ν 컨ν μ€νΈκ° νμ±λλ κ²½μ°λ₯Ό μΈ κ°μ§λ‘ κ·μ νλ€.
μ μ μ½λ
eval()
ν¨μλ‘ μ€νλλ μ½λν¨μ μμ μ½λλ₯Ό μ€νν κ²½μ°
λλΆλΆ ν¨μλ‘ μ€ν 컨ν μ€νΈλ₯Ό λ§λλλ°, μ΄ μ½λ λΈλ‘ μμ λ³μ λ° κ°μ²΄, μ€ν κ°λ₯ν μ½λκ° λ€μ΄μλ€. μ΄ μ½λκ° μ€νλλ©΄ μ€ν 컨ν μ€νΈκ° μμ±λκ³ , μ€ν 컨ν μ€νΈκ° μ€ν μμ νλμ© μ°¨κ³‘μ°¨κ³‘ μμ΄λ©° μ€νλλ€.
ECMAScriptμμλ μ€ν 컨ν μ€νΈμ μμ±μ λ€μμ²λΌ μ€λͺ νλ€.
"νμ¬ μ€νλλ 컨ν μ€νΈμμ μ΄ μ»¨ν μ€νΈμ κ΄λ ¨ μλ μ€ν μ½λκ° μ€νλλ©΄, μλ‘μ΄ μ»¨ν μ€νΈκ° μμ±λμ΄ μ€νμ λ€μ΄κ°κ³ μ μ΄κΆμ΄ κ·Έ 컨ν μ€νΈλ‘ μ΄λνλ€."
var x = 'xxx';
function foo() { var y = 'yyy';
function bar() { var z = 'zzz'; console.log(x + y + z); } bar();}foo();
μ μ½λλ₯Ό μ€ννλ©΄ μλμ κ°μ΄ μ€ν 컨ν μ€νΈ μ€ν(Stack)μ΄ μμ±νκ³ μλ©Ένλ€.
νμ¬ μ€ν μ€μΈ 컨ν μ€νΈμμ μ΄ μ»¨ν μ€νΈμ κ΄λ ¨μλ μ½λ(λ€λ₯Έ ν¨μ λ±)κ° μ€νλλ©΄μλ‘μ΄ μ»¨ν μ€νΈκ° μμ±λκ³ μ€νμ μμ΄κ³ μ μ΄κΆμ΄ μ΄λνλ€.
μμ λ° κ·Έλ¦Ό μΆμ² : μ€ν 컨ν μ€νΈμ μλ°μ€ν¬λ¦½νΈμ λμ μ리 - Poiemaweb
컨νΈλ‘€μ΄ μ€ν κ°λ₯ν μ½λλ‘ μ΄λνλ©΄, λ Όλ¦¬μ μ€ν ꡬ쑰λ₯Ό κ°μ§λ μλ‘μ΄ μ€ν컨ν μ€νΈ μ€νμ΄ μμ±λλ€. μ€νμ LIFO(Last In First Out, νμ μ μΆ)μ ꡬ쑰λ₯Όκ°μ§λ λμ΄ κ΅¬μ‘°μ΄λ€.
μ μ μ½λ(Global code)λ‘ μ»¨νΈλ‘€μ΄ μ§μ νλ©΄, μ μ μ€ν 컨ν μ€νΈκ° μμ±λκ³ μ€ν 컨ν μ€νΈ μ€νμ μμΈλ€. μ μ μ€ν 컨ν μ€νΈλ μ ν리μΌμ΄μ μ΄ μ’ λ£λ λ(μΉνμ΄μ§μμ λκ°κ±°λ λΈλΌμ°μ λ₯Ό λ«μ λ)κΉμ§ μ μ§λλ€.
ν¨μλ₯Ό νΈμΆνλ©΄ ν΄λΉ ν¨μμ μ€ν 컨ν μ€νΈκ° μμ±λλ©° μ§μ μ μ€νλ μ½λ λΈλ‘μ μ€ν 컨ν μ€νΈ μμ μμΈλ€.
ν¨μ μ€νμ΄ λλλ©΄ ν΄λΉ ν¨μμ μ€ν 컨ν μ€νΈλ₯Ό νκΈ°νκ³ μ§μ μ μ€ν 컨ν μ€νΈμ 컨νΈλ‘€μ λ°ννλ€.
#
μ€ν 컨ν μ€νΈ μμ± κ³Όμ μλ°μ€ν¬λ¦½νΈμμ ν¨μλ₯Ό μ€ννλ©΄, μ€ν 컨ν μ€νΈκ° μμ±λλ€. μ€ν 컨ν μ€νΈκ° μμ±λ μ΄νμ μλ°μ€ν¬λ¦½νΈ μμ§μ λ€μμ μΌμ μμλλ‘ μ€ννλ€.
νμ± κ°μ²΄ μμ±
arguments
κ°μ²΄ μμ±μ€μ½ν μ 보 μμ±
λ³μ μμ±
this
λ°μΈλ©μ½λ μ€ν
#
νμ± κ°μ²΄ μμ±μ€ν 컨ν μ€νΈκ° μμ±λλ©΄ ν΄λΉ 컨ν μ€νΈ μ€νμ νμν μ 보λ₯Ό λ΄μ κ°μ²΄λ₯Ό μμ±νλ€. μ΄λ₯Ό νμ± κ°μ²΄ λλ λ³μ κ°μ²΄ λΌκ³ νλ€. μ΄ κ°μ²΄μ λ³μ, 맀κ°λ³μμ μΈμ, ν¨μ μ μΈμ μ 보λ₯Ό λ΄λλ€.
arguments
κ°μ²΄ μμ±#
λ€μμΌλ‘λ arguments
κ°μ²΄λ₯Ό μμ±νλ€. μμ λ§λ€μ΄μ§ νμ± κ°μ²΄λ arguments
νλ‘νΌν°λ‘ μ΄ arguments
κ°μ²΄λ₯Ό μ°Έμ‘°νλ€.
#
μ€μ½ν μ 보 μμ±λ€μμΌλ‘λ μ€μ½ν μ 보λ₯Ό μμ±νλ€. μ€μ½ν μ 보λ νμ¬ μ»¨ν μ€νΈμ μ ν¨ λ²μλ₯Ό λνλΈλ€. μ΄λ νμ¬ μ€ν μ€μΈ μ€ν 컨ν μ€νΈ μμμ μ°κ²° 리μ€νΈμ μ μ¬ν νμμΌλ‘λ§λ€μ΄μ§λ€. μ΄ λ¦¬μ€νΈλ‘ νμ¬ μ»¨ν μ€νΈλΆν° μμ μ€ν 컨ν μ€νΈμ λ³μκΉμ§ μ κ·Ό κ°λ₯νλ€.
μμΈν κ³Όμ μ μ€μ½ν 체μ΄λμμ μ΄ν΄λ³Έλ€.
#
λ³μ μμ±λ€μμΌλ‘ νμ¬ μ€ν 컨ν
μ€νΈ λ΄λΆμμ μ¬μ©λλ μ§μ λ³μκ° μμ±λλ€. λ³μ κ°μ²΄ μμμ νΈμΆλ ν¨μ μΈμλ κ°κ°μ νλ‘νΌν°κ° λ§λ€μ΄μ§κ³ κ·Έ κ°μ΄ ν λΉλλ€. (κ°μ΄ λ겨μ§μ§ μμλ€λ©΄ undefined
κ° ν λΉλλ€)
λ³μλ λ΄λΆ ν¨μμ κ²½μ° λ¨μ§ λ©λͺ¨λ¦¬μ μμ±νκ³ μ΄κΈ°νλ κ° λ³μλ ν¨μμ ν΄λΉνλ ννμμ΄ μ€νλκΈ° μ κΉμ§λ μ΄λ£¨μ΄μ§μ§ μλλ€. (ν¨μ μ μΈλ¬Έμ κ²½μ° ν¨μ νΈμ΄μ€ν μ΄ μΌμ΄λ ν¨μ κ°μ²΄λ₯Ό μ¦μ ν λΉνλ€.)
this
λ°μΈλ©#
λ§μ§λ§ λ¨κ³μμλ this
ν€μλλ₯Ό μ¬μ©νλ κ°μ΄ ν λΉλλ€. μ΄ κ°μ μ΄λ€ κ°μ²΄κ° λ€μ΄κ°μ§λ ν¨μνΈμΆκ³Ό this
λ°μΈλ©μμ μ΄ν΄λ΄€μΌλ μ°Έμ‘°νμ.
#
μ½λ μ€νμ΄λ κ² νλμ μ€ν 컨ν μ€νΈκ° μμ±λκ³ λ³μ κ°μ²΄κ° λ§λ€μ΄μ§ νμ μ½λμ μλ ννμμ΄ μ€νλλ€.
#
μ€μ½ν 체μΈμλ°μ€ν¬λ¦½νΈμμλ ν¨μ λ΄μ {}
λΈλ‘, μ¦ for() {}
, if() {}
μ κ°μ ꡬ문μμ ν¨ λ²μκ° μκ³ , μ€μ§ ν¨μλ§μ΄ μ ν¨ λ²μμ ν λ¨μκ° λλ€. (ES6μμλ let, constλ₯Ό ν΅ν΄ {}
μμ μ ν¨ λ²μλ₯Ό κ°κ² λ§λ€ μ μλ€.)
μ΄ μ ν¨ λ²μλ₯Ό λνλ΄λ μ€μ½νκ° [[scope]]
νλ‘νΌν°λ‘ κ° ν¨μ λ΄μμ μ°κ²° 리μ€νΈ νμμΌλ‘ κ΄λ¦¬λλλ°, μ΄λ₯Ό μ€μ½ν 체μΈμ΄λΌκ³ νλ€.
κ°κ°μ ν¨μλ
[[scope]]
νλ‘νΌν°λ‘ μμ μ΄ μμ±λ μ€ν 컨ν μ€νΈμμ€μ½ν 체μΈμ μ°Έμ‘°νλ€.ν¨μκ° μ€νλλ μκ° μ€ν 컨ν μ€νΈκ° μμ±λκ³ μ΄ μ€ν 컨ν μ€νΈλ μ€νλ ν¨μμ
[[scope]]
νλ‘νΌν°λ₯Ό κΈ°λ°μΌλ‘ μλ‘μ΄ μ€μ½ν 체μΈμ λ§λ λ€.
#
μ μ μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈvar var1 = 1;var var2 = 2;console.log(var1); // 1console.log(var2); // 2
μ΄λ μ μ μ½λμ΄λ€. μ΄ μ½λλ₯Ό μ€ννλ©΄ μ μ μ€ν 컨ν
μ€νΈκ° μμ±λκ³ λ³μ κ°μ²΄κ°λ§λ€μ΄μ§λ€. νμ¬ μ μ μ€ν 컨ν
μ€νΈ λ¨ νλλ§ μ€νλκ³ μμ΄ μ°Έμ‘°ν μμ 컨ν
μ€νΈκ° μκ³ λ°λΌμ μ΄ λ³μ κ°μ²΄μ μ€μ½ν 체μΈμ μκΈ° μμ λ§μ κ°μ§λ€. μ¦ λ³μ κ°μ²΄μ [[scope]]
νλ‘νΌν°λ λ³μ κ°μ²΄ μμ μ κ°λ¦¬ν¨λ€.
#
ν¨μλ₯Ό νΈμΆν κ²½μ° μμ±λλ μ€ν 컨ν μ€νΈμ μ€μ½ν 체μΈvar var1 = 1;var var2 = 2;
function func() { var var1 = 10; var var2 = 20; console.log(var1); // 10 console.log(var2); // 20}
func();
console.log(var1); // 1console.log(var2); // 2
μ΄ μμ λ₯Ό μ€ννλ©΄ μ μ μ€ν 컨ν
μ€νΈκ° μμ±λκ³ func()
ν¨μ κ°μ²΄κ° λ§λ€μ΄μ§λ€ . μ΄ ν¨μ κ°μ²΄μ [[scope]]
λ μ΄λ»κ² λ κΉ? ν¨μ κ°μ²΄κ° μμ±λ λ, κ·Έ ν¨μ κ°μ²΄μ [[scope]]
λ νμ¬ μ€νλλ 컨ν
μ€νΈμ λ³μ κ°μ²΄μ μλ [[scope]]
λ₯Ό κ·Έλλ‘ κ°μ§λ€. λ°λΌμ func
ν¨μ κ°μ²΄μ [[scope]]
λ μ μ λ³μ κ°μ²΄κ° λλ€.
κ·Έλ¦¬κ³ func()
ν¨μκ° μ€νλ λ, μλ‘μ΄ μ»¨ν
μ€νΈ( func
μ€ν 컨ν
μ€νΈ)κ° μμ±λλ€. μ΄ func
μ€ν 컨ν
μ€νΈμ μ€μ½ν 체μΈμ μ€νλ ν¨μμ [[scope]]
νλ‘νΌν°λ₯Ό κ·Έλλ‘ λ³΅μ¬ν ν, νμ¬ μμ±λ λ³μ κ°μ²΄λ₯Ό 볡μ¬ν μ€μ½ν 체μΈμ 맨 μμ μΆκ°νλ€.
#
μμ 1var value = 'value1';
function printFunc() { var value = 'value2';
function printValue() { return value; }
console.log(printValue());}
printFunc();
[μΆλ ₯ κ²°κ³Ό]
value2
#
μμ 2var value = 'value1';
function printValue() { return value;}
function printFunc(func) { var value = 'value2'; console.log(func());}
printFunc(printValue);
[μΆλ ₯ κ²°κ³Ό]
value1
μ λ μμ λ λ μ컬 μ€μ½ν(Lexical scoping)μ μ΄ν΄νλλ° μ€μν μμ μ΄λ€. - π ν¨μμ λ²μ(scope) - ZeroCho
#
ν΄λ‘μ #
ν΄λ‘μ μ κ°λ function outerFunc() { var x = 10; var innerFunc = function () { console.log(x); }; return innerFunc;}
var inner = outerFunc();inner(); // 10
μμ μμ innerFunc()
λ outerFunc()
μ μ€νμ΄ λλ ν μ€νλλ€. outerFunc()
μ μ€ν 컨ν
μ€νΈκ° μ¬λΌμ§ μ΄νμ innerFunc
μ€ν 컨ν
μ€νΈκ° μμ±λλ κ²μ΄λ€. κ·Έλ¬λ©΄ innerFunc()
μ μ€μ½ν 체μΈμ outerFunc
λ³μ κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μμκΉ?
μ΄κ²μ κ°λ₯νκ² νλ κ²μ΄ ν΄λ‘μ (Closure) λΌλ κ°λ
μ΄λ€. outerFunc
μ μ€ν컨ν
μ€νΈκ° μ¬λΌμ§λλΌλ outerFunc
λ³μ κ°μ²΄λ μ¬μ ν λ¨μμλ€.
μ¬κΈ°μ μ΅μ’
λ°νλλ ν¨μ innerFunc
κ° μΈλΆ ν¨μ outerFunc
μ μ§μλ³μ x
μ μ κ·Όνκ³ μλ€λ κ²μ΄ μ€μνλ€. μ΄ μ§μ λ³μμ μ κ·Όνλ €λ©΄, ν¨μκ° μ’
λ£λμ΄ μ€ν 컨ν
μ€νΈκ° λ°νλλλΌλ, λ³μ κ°μ²΄λ λ°νλλ λ΄λΆ ν¨μμ μ€μ½ν 체μΈμ κ·Έλλ‘ λ¨μμμ΄μΌλ§ μ κ·Όν μ μλ€.
μ΄μ²λΌ μ΄λ―Έ μλͺ
μ£ΌκΈ°κ° λλ μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘°νλ ν¨μλ₯Ό ν΄λ‘μ λΌκ³ νλ€. λ°λΌμ innerFunc()
λ₯Ό ν΄λ‘μ λΌκ³ νκ³ , ν΄λ‘μ λ‘ μ°Έμ‘°λλ μΈλΆ λ³μ x
λ₯Ό μμ λ³μ λΌκ³ νλ€.
#
μ°Έκ³ μλ£π ν¨μμ λ²μ(scope) - ZeroCho
π μ€ν 컨ν μ€νΈμ μλ°μ€ν¬λ¦½νΈμ λμ μ리 - Poiemaweb