κΈ°λ³Έμ μΌλ‘ μλ°μ€ν¬λ¦½νΈλ ECMAScript μΈμ΄ λͺ μΈλ₯Ό λ°λ₯΄κ³ μλ€. μ΄ λͺ μΈ 8μ₯μ μ€νμ½λμ μ€ν컨ν μ€νΈλΆλΆμμ μ€μ½νμ κ΄ν λμ λ°©μμ νμΈν μ μμΌλ©°, λ μ€μν κ°λ μΈ 1κΈ κ°μ²΄λ‘μμ ν¨μλ κ·Έ νΉμ§μ λͺ μΈμ μ λ°μ μΈ λΆλΆμμ λνλ΄κ³ μλ€. κ·Έλ¦¬κ³ , ν΄λ‘μ (Closure)μ λν μ μλ μλ€. ν΄λ‘μ λ μλ°μ€ν¬λ¦½νΈκ° μ±μ©νκ³ μλ κΈ°μ μ κΈ°λ° νΉμ 컨μ μΌλ‘, μλ°μ€ν¬λ¦½νΈλ ν΄λ‘μ λ₯Ό μ΄μ©νμ¬ μ€μ½νμ νΉμ§κ³Ό μΌκΈ κ°μ²΄λ‘μμ ν¨μμ λν λͺ μΈλ₯Ό ꡬνν κ²μ΄λ€.
κΉμΆμ μμΈμ "κ½"μ΄λΌλ μλ₯Ό 보면, μ΄λ€ νλμ λͺΈμ§μ μ΄λ¦μ ν΅ν΄ μλ―Έλ₯Ό λΆμ¬λ°κ³ κ½μ΄ λλ€.
νλ‘κ·Έλλ°λ λ§μ°¬κ°μ§λ‘ λ³μλ ν¨μμ μ΄λ¦μ λΆμ¬νμ¬ μλ―Έλ₯Ό κ°λλ‘ νλ€. λ§μ½ μ΄λ¦μ΄ μλ€λ©΄, λ³μλ ν¨μλ λ€λ§ κ·Έμ νλμ λ©λͺ¨λ¦¬ μ£Όμμ μ§λμ§ μλλ€. κ·Έλμ νλ‘κ·Έλ¨μ "μ΄λ¦:κ°"μ λμνλ₯Ό λ§λ€μ΄ μ¬μ©νλ€. μ΄ λμνμ μ΄λ¦μ κ°μ§κ³ μ½λλ₯Ό λ³΄λ€ μ½κ² μ΄ν΄νκ³ , λ μ΄λ¦μ ν΅ν΄ κ°μ μ μ₯νκ³ , λ€μ κ°μ Έμ μμ νλ€.
μ΄κΈ° νλ‘κ·Έλλ° μΈμ΄λ μ΄ λμνλ₯Ό νλ‘κ·Έλ¨ μ 체μμ νλλ‘ κ΄λ¦¬νλλ°, μ¬κΈ°μλ μ΄λ¦ μΆ©λμ λ¬Έμ κ° μμλ€. κ·Έλμ μΆ©λμ νΌνκΈ° μν΄, κ° μΈμ΄λ§λ€ "μ€μ½ν"λΌλ κ·μΉμ λ§λ€μ΄ μ μνμλ€. κ·Έλ κ² μ€μ½ν κ·μΉμ μΈμ΄μ λͺ μΈ(Specification)κ° λμλ€.
μλ°μ€ν¬λ¦½νΈλ λ§μ°¬κ°μ§λ‘ μμ μ μ€μ½ν κ·μΉμ΄ μλ€.
μλ°μ€ν¬λ¦½νΈ(ES6)λ ν¨μ λ 벨과 λΈλ‘ λ 벨
μ λ μ컬 μ€μ½ν
κ·μΉμ λ°λ₯Έλ€.
μλ°μ€ν¬λ¦½νΈλ μ ν΅μ μΌλ‘ ν¨μ λ 벨 μ€μ½νλ₯Ό μ§μν΄μκ³ , μΌλ§μ κΉμ§λ§ ν΄λ λΈλ‘ λ 벨 μ€μ½νλ μ§μνμ§ μμλ€. νμ§λ§ κ°μ₯ μ΅μ λͺ μΈμΈ ES6(ECMAScript 6)λΆν° λΈλ‘ λ 벨 μ€μ½νλ₯Ό μ§μνκΈ° μμνλ€.
μλ°μ€ν¬λ¦½νΈμμ var
ν€μλλ‘ μ μΈλ λ³μλ, ν¨μ μ μΈμ
μΌλ‘ λ§λ€μ΄μ§ ν¨μλ ν¨μ λ 벨 μ€μ½ν
λ₯Ό κ°λλ€. μ¦, ν¨μ λ΄λΆ μ 체μμ μ ν¨ν μλ³μκ° λλ€.
μλ μ½λλ μλ¬΄λ° λ¬Έμ μμ΄ blue
λ₯Ό μΆλ ₯νλ€.
function foo() {
if (true) {
var color = "blue";
}
console.log(color); // blue
}
foo();
λ§μ½ var color
κ° λΈλ‘ λ 벨 μ€μ½νμλ€λ©΄, color
λ if
λ¬Έμ΄ λλ λ νκ΄΄λκ³ console.log
μμ μλͺ»λ μ°Έμ‘°λ‘ μλ¬κ° λ°μν κ²μ΄λ€. κ·Έλ μ§λ§ color
λ ν¨μ λ 벨μ μ€μ½νμ΄κΈ° λλ¬Έμ foo
ν¨μ λ΄λΆ μ΄λμμλ μλ¬ λ°μ μμ΄ μ°Έμ‘°ν μ μλ€.
ES6μ let
, const
ν€μλλ λΈλ‘ λ 벨 μ€μ½ν λ³μλ₯Ό λ§λ€μ΄ μ€λ€.
function foo() {
if (true) {
let color = "blue";
console.log(color); // blue
}
console.log(color); // ReferenceError: color is not defined
}
foo();
let color
λ₯Ό if
λΈλ‘ λ΄λΆμμ μ μΈνμλ€. λλ¬Έμ if
λΈλ‘ λ΄λΆμμ μ°Έμ‘°ν μ μμΌλ©°, κ·Έ λ°μ μμμμ μλͺ»λ μ°Έμ‘°λ‘ μλ¬κ° λ°μνλ€.
var
vs let
, const
ES6κ° νμ€νλλ©΄μ, λΈλ‘ λ 벨과 ν¨μ λ 벨μ λͺ¨λ μ§μνκ² λμλ€. "You don't know JS" μ리μ¦μ μ μμΈ Kyle Simpsonμ var
, let
, const
κ° μλ‘ λ€λ₯΄κΈ°μ νμν μν©μ μλ§κ² μ¬μ©ν μ€ μμμΌ νλ€κ³ μ€λͺ
νκ³ μλ€.
κ·Έλ μ§λ§ μμ¦μ ES6 μ½λ λλΆλΆμ var
λ₯Ό μ¬μ©νμ§ μλλ€. var
λ let
κ³Ό const
λ‘ λͺ¨λ λμ²΄κ° κ°λ₯νκ³ , var
μμ²΄κ° ν¨μ λ 벨μ μ€μ½νλ₯Ό κ°μ§κΈ° λλ¬Έμ λΈλ‘ λ 벨 μ€μ½νλ³΄λ€ λ λ§μ νΌλμ μΌκΈ°νκΈ° λλ¬Έμ΄λ€.
λ μ컬 μ€μ½ν(Lexical scope)λ λ³΄ν΅ λμ μ€μ½ν(Dynamic scope)μ λ§μ΄ λΉκ΅νλ€.
μν€νΌλμλ₯Ό 보면 λμ μ€μ½νμ λ μ컬 μ€μ½νλ₯Ό λ€μκ³Ό κ°μ΄ μ μνκ³ μλ€.
λμ μ€μ½ν
The name resolution depends upon the program state when the name is encountered which is determined by the execution context or calling context.
λ μ컬 μ€μ½ν (μ μ μ€μ½ν(Static scope) λλ μμ¬μ μ€μ½ν(Rhetorical scope))
The name resolution depends on the location in the source code and the lexical context, which is defined by where the named variable or function is defined.
λμ μ€μ½νλ νλ‘κ·Έλ¨μ λ°νμ λμ€μ μ€ν 컨ν μ€νΈλ νΈμΆ 컨ν μ€νΈμ μν΄ κ²°μ λκ³ , λ μ컬 μ€μ½νμμλ μμ€μ½λκ° μμ±λ κ·Έ λ¬Έλ§₯μμ κ²°μ λλ€. νλ νλ‘κ·Έλλ°μμ λλΆλΆμ μΈμ΄λ€μ λ μ컬 μ€μ½ν κ·μΉμ λ°λ₯΄κ³ μλ€.
λμ μ€μ½νμ λ μ컬 μ€μ½νλ μλ°μ€ν¬λ¦½νΈμ Perlμ λΉκ΅νμ¬ νμΈν μ μλ€. μλλ μλ°μ€ν¬λ¦½νΈμ Perlλ‘ κ°μ μ½λλ₯Ό μμ±νμμ λ λμ€λ κ²°κ³Όμ΄λ€.
μλ°μ€ν¬λ¦½νΈλλ λ μ컬 μ€μ½ν κ·μΉμ ν΅ν΄ global, global
μ μΆλ ₯νμμΌλ©°, Perlμ λμ μ€μ½ν κ·μΉμ ν΅ν΄ local, global
μ μΆλ ₯νμλ€. (μ°Έκ³ λ‘ Perlμμ local
λμ my
ν€μλλ₯Ό μ¬μ©νλ©΄ λ³μμ μ ν¨λ²μλ₯Ό μ ννμ¬, μλ°μ€ν¬λ¦½νΈμ κ°μ κ²°κ³Όλ₯Ό μ»μ μ μλ€.)
λ μ컬 μ€μ½ν κ·μΉμ λ°λ₯΄λ μλ°μ€ν¬λ¦½νΈμ ν¨μλ νΈμΆ μ€νκ³Ό κ΄κ³μμ΄ κ°κ°μ (this
λ₯Ό μ μΈν)λμνλ₯Ό μμ€μ½λ κΈ°μ€μΌλ‘ μ μνκ³ , λ°νμμ κ·Έ λμνλ₯Ό λ³κ²½μν€μ§ μλλ€. (μ¬μ€ λ°νμμ λ μ컬 μ€μ½νλ₯Ό μμ ν μ μλ λ°©λ²λ€(eval
, with
)μ΄ μμ§λ§, κΆμ₯νμ§ μλλ€.)
μ°λ¦¬κ° λ§νλ μ΄ μλ°μ€ν¬λ¦½νΈμ μ€μ½νλ ECMAScript μΈμ΄ λͺ
μΈμμ λ μ컬 νκ²½(Lexical environment
)κ³Ό νκ²½ λ μ½λ(Environment Record
)λΌλ κ°λ
μΌλ‘ μ μλμλ€.
6.2.5 The Lexical Environment and Environment Record Specification Types
The Lexical Environment and Environment Record types are used to explain the behaviour of name resolution in nested functions and blocks. These types and the operations upon them are defined in 8.1.
κ°λ¨νκ² κ·Έλ¦ΌμΌλ‘ ννν΄λ³΄λ©΄ μλμ κ°μ ννλ‘ λ³Ό μ μλ€.
μμμ μ€λͺ ν "μ΄λ¦:κ°μ λμν"κ° νκ²½ λ μ½λμ κ°λ€κ³ λ³Ό μ μκ³ , λ μ컬 νκ²½μ μ΄ νκ²½ λ μ½λμ μμ λ μμΌ€ νκ²½(Outer lexical environment)μ λν μ°Έμ‘°λ‘ μ΄λ£¨μ΄μ§λ€.
νμ¬-λ μ컬 νκ²½μ λμν(νκ²½ λ μ½λ)μμ λ³μλ₯Ό μ°Ύμλ³΄κ³ , μλ€λ©΄ λ°κΉ₯ λ μ컬 νκ²½μ μ°Έμ‘°νμ¬ μ°Ύμ보λ μμΌλ‘ μ€μ²© μ€μ½νκ° κ°λ₯ν΄μ§λ€. μ΄ μ€μ²© μ€μ½ν νμμ ν΄λΉνλ μ΄λ¦μ μ°Ύλκ° μλλ©΄ λ°κΉ₯ λ μ컬 νκ²½ μ°Έμ‘°κ° null
μ΄ λ λ νμμ λ©μΆλ€.
μ°Έκ³ : ECMA-262 Edition3λ₯Ό 보면 μλ°μ€ν¬λ¦½νΈμ μ€μ½νμ νΉμ§μ Scope chain
(=list)κ³Ό Activation Object
λ±μ κ°λ
μΌλ‘ μ€λͺ
νμλ€. κ·Έλ¦¬κ³ μ΄ μ€λͺ
λ€μ΄ μ λ°μ μΌλ‘ λ리 μλ €μ‘μ§λ§, μ΄ λ€μ λͺ
μΈμΈ ECMA262 Edition5λΆν°λ Lexical Environment
μ Environment Record
μ κ°λ
μΌλ‘ μ€μ½νλ₯Ό μ€λͺ
νκ³ μλ€.
μ ν΅μ μΈ μλ°μ€ν¬λ¦½νΈ μ€μ½νμ νΉμ§μ λ€μ λ κ°μ§λΌλ κ²μ μμλ€.
κ·ΈλΌ μλμ κ°μ μν©μμ μ΄λ€ κ°μ΄ μΆλ ₯λ κΉ?
function foo() {
a = 2;
var a;
console.log(a);
}
foo();
2
κ° μ μμ (?)μΌλ‘ μΆλ ₯λλ€.
κ·ΈλΌ λ€μμ μ΄λ¨μ§ μκ°ν΄λ³΄μ.
function foo() {
console.log(a);
var a = 2;
}
foo();
μ΄λ²μλ undefined
κ° μΆλ ₯λλ€. μ‘°κΈ μ΄μ΄μλ€κ³ λλ μ μμ§λ§, μ¬μ€ μκ³ λ³΄λ©΄ μ΄μ΄μλ μΌμ μλλ€.
μλ°μ€ν¬λ¦½νΈ μμ§μ μ½λλ₯Ό μΈν°ν리ν
νκΈ°μ μ κ·Έ μ½λλ₯Ό λ¨Όμ μ»΄νμΌνλ€. var a = 2;
λ₯Ό νλμ ꡬ문μΌλ‘ μκ°ν μλ μμ§λ§, μλ°μ€ν¬λ¦½νΈλ λ€μ λ κ°μ ꡬ문μΌλ‘ λΆλ¦¬νμ¬ λ³Έλ€.
var a;
a = 2;
λ³μ μ μΈ(μμ±) λ¨κ³μ μ΄κΈ°ν λ¨κ³λ₯Ό λλκ³ , μ μΈ λ¨κ³μμλ κ·Έ μ μΈμ΄ μμ€μ½λμ μ΄λμ μμΉνλ ν΄λΉ μ€μ½νμ μ»΄νμΌλ¨κ³μμ μ²λ¦¬ν΄λ²λ¦¬λ κ²μ΄λ€. (μΈμ΄ μ€νμμΌλ‘ λ³μλ λ μ컬 νκ²½μ΄ μΈμ€ν΄μ€νλκ³ μ΄κΈ°νλ λ μμ±λλ€κ³ νλ€.) λλ¬Έμ μ΄λ° μ μΈλ¨κ³κ° μ€μ½νμ κΌλκΈ°λ‘ νΈμ΄μ€ν ("λμ΄μ¬λ¦Ό")λλ μμ μ΄λΌκ³ λ³Ό μ μλκ²μ΄λ€.
μ°Έκ³ : λΈλ‘μ€μ½νμΈ let
λ νΈμ΄μ€ν
μ΄ λλ€. κ·Έλ μ§λ§ μ μΈμ μ μ°Έμ‘°ν κ²½μ° undefined
λ₯Ό λ°ννμ§ μκ³ ReferenceErrorλ₯Ό λ°μμν€λ νΉμ§μ΄ μλ€.
Temporal dead zone and errors with let
In ECMAScript 2015, let will hoist the variable to the top of the block. However, referencing the variable in the block before the variable declaration results in a ReferenceError. The variable is in a "temporal dead zone" from the start of the block until the declaration is processed.
μλ°μ€ν¬λ¦½νΈμμ (μΈμ΄ λͺ μΈμ μλ) ν΄λ‘μ μ λν μ μλ κ½€ λ§μ μ¬λλ€μ΄ κ°μ₯ κΆκΈν΄νλ λΆλΆμ΄λ€.
μλλ μ€μ v8μμ§μ ν΄λ‘μ ν μ€νΈμ½λμ μ¬λλ€μ΄ λ§νλ ν΄λ‘μ μ μλ―Έλ€μ΄λ€.
μ’ ν©ν΄λ³΄λ©΄ ν¨μκ° λ¬΄μΈκ°λ₯Ό κΈ°μ΅νκ³ κ·Έκ²μ λ€μ μ¬μ©νλ€λ κ²μ μ μ μμ§λ§, μ¬μ ν λͺ¨νΈνκ² λκ»΄μ§λ€. μ΄ λͺ¨νΈν¨μ μμ κΈ° μν΄ ν΄λ‘μ μ νμλΆν° μμλ΄μΌ ν κ² κ°λ€.
ν΄λ‘μ κ° κ°μ₯ μ²μ λ±μ₯ν 1964λ , Peter J. Landinμ λ Όλ¬Έ(The Mechanical Evaluation of Expressions)μ 보면 ν΄λ‘μ λ₯Ό λ€μκ³Ό κ°μ΄ μ μνκ³ μλ€.
μ μ μλ₯Ό ν λλ‘, ν΄λ‘μ λ₯Ό νλ νλ‘κ·Έλλ°μμ λ€μκ³Ό κ°μ΄ ν΄μνμ¬ μ μν μ μμκ² κ°λ€.
ν΄λ‘μ =
ν¨μ + ν¨μλ₯Ό λλ¬μΌ νκ²½(Lexical environment)
ν¨μλ₯Ό λλ¬μΌ νκ²½μ΄λΌλκ²μ΄ λ°λ‘ μμμ μ€λͺ νλ λ μ컬 μ€μ½νμ΄λ€. ν¨μλ₯Ό λ§λ€κ³ κ·Έ ν¨μ λ΄λΆμ μ½λκ° νμνλ μ€μ½νλ₯Ό ν¨μ μμ± λΉμμ λ μ컬 μ€μ½νλ‘ κ³ μ νλ©΄ λ°λ‘ ν΄λ‘μ κ° λλκ²μ΄λ€.
μ΄μ μ΄ ν΄λ‘μ κ° μλ°μ€ν¬λ¦½νΈμ μ΄λ»κ² λ Ήμλ€μ΄κ°λμ§ μ΄ν΄λ³΄λλ‘ νμ.
λ°λΌμ κ°λ μ μΌλ‘ μλ°μ€ν¬λ¦½νΈμ λͺ¨λ ν¨μλ ν΄λ‘μ μ΄μ§λ§, μ€μ λ‘ μ°λ¦¬λ μλ°μ€ν¬λ¦½νΈμ λͺ¨λ ν¨μλ₯Ό μ λΆ ν΄λ‘μ λΌκ³ λΆλ₯΄μ§λ μλλ€.
λ€μ μμλ€μ ν΅ν΄μ ν΄λ‘μ λ₯Ό μ‘°κΈ λ μ νν νμ ν μ μλ€.
function foo() {
var color = "blue";
function bar() {
console.log(color);
}
bar();
}
foo();
bar
ν¨μλ μ°λ¦¬κ° λΆλ₯΄λ ν΄λ‘μ
μΌκΉ μλκΉ?
μΌλ¨ bar
λ foo
μμ μνκΈ° λλ¬Έμ foo
μ€μ½νλ₯Ό μΈλΆ μ€μ½ν(outer lexical environment) μ°Έμ‘°λ‘ μ μ₯νλ€. κ·Έλ¦¬κ³ bar
λ μμ μ λ μ컬 μ€μ½ν 체μΈμ ν΅ν΄ foo
μ color
λ₯Ό μ νν μ°Έμ‘°ν κ²μ΄λ€.
κ·ΈλΌ ν΄λ‘μ λΌ λ³Ό μ μμ§ μμκΉ?
μλλ€. μ°λ¦¬κ° λΆλ₯΄λ ν΄λ‘μ λΌκ³ νκΈ°μλ μ½κ° κ±°λ¦¬κ° μλ€. bar
λ foo
μμμ μ μλκ³ μ€νλμμ λΏ, foo
λ°μΌλ‘ λμ€μ§ μμκΈ° λλ¬Έμ ν΄λ‘μ λΌκ³ λΆλ₯΄μ§ μλλ€.
λμ , λ€μ μ½λλ μ°λ¦¬κ° μ€μ λ‘ λΆλ₯΄λ ν΄λ‘μ λ₯Ό λνλ΄κ³ μλ€.
var color = "red";
function foo() {
var color = "blue"; // 2
function bar() {
console.log(color); // 1
}
return bar;
}
var baz = foo(); // 3
baz(); // 4
bar
λ color
λ₯Ό μ°Ύμ μΆλ ₯νλ ν¨μλ‘ μ μλμλ€.bar
λ outer environment μ°Έμ‘°λ‘ fooμ environmentλ₯Ό μ μ₯νμλ€.bar
λ₯Ό global
μ baz
λ μ΄λ¦μΌλ‘ λ°λ €μλ€.global
μμ baz(=bar)
λ₯Ό νΈμΆνλ€.bar
λ μμ μ μ€μ½νμμ color
λ₯Ό μ°Ύλλ€.color
λ₯Ό μ°Ύμλ€. κ°μ blue
μ΄λ€.blue
κ° μΆλ ₯λλ€.μ΄κ² λ°λ‘ ν΄λ‘μ λ€. κ·Έλ₯ λ¨μνκ² λ³΄λ©΄ "μ΄ λΉμ°νκ² μ?"λΌκ³ μκ°ν μ μμ§λ§, μ‘°κΈ λ μμΈν λ°μ Έλ³΄λλ‘ νμ.
μΌλ¨ μ€μν λΆλΆμ 2~4λ², κ·Έλ¦¬κ³ 7λ²μ΄λ€. bar
λ μμ μ΄ μμ±λ λ μ컬 μ€μ½νμμ λ²μ΄λ globalμμ baz
λΌλ μ΄λ¦μΌλ‘ νΈμΆμ΄ λμκ³ , μ€μ½ν νμμ νμ¬ μ€ν μ€νκ³Ό κ΄λ ¨ μλ foo
λ₯Ό κ±°μ³ κ°λ€. baz
λ₯Ό bar
λ‘ μ΄κΈ°ν ν λλ μ΄λ―Έ bar
μ outer lexical environment
λ₯Ό foo
λ‘ κ²°μ ν μ΄νμ΄λ€. λλ¬Έμ, bar
μ μμ±κ³Ό μ§μ μ μΈ κ΄λ ¨μ΄ μλ global
μμ μ무리 νΈμΆνλλΌλ μ¬μ ν foo
μμ color
λ₯Ό μ°Ύλ κ²μ΄λ€. μ΄λ° bar(λλ baz)
μ κ°μ ν¨μλ₯Ό μ°λ¦¬λ ν΄λ‘μ λΌκ³ λΆλ₯Έλ€.
μ¬κΈ°μμ λ€μνλ² κ°μ‘°νμ§λ§ JSμ μ€μ½νλ λ μ컬 μ€μ½ν, μ¦ μ΄λ¦μ λ²μλ μμ€μ½λκ° μμ±λ κ·Έ λ¬Έλ§₯μμ λ°λ‘ κ²°μ λλ κ²μ΄λ€.
μΆκ°λ‘, foo
μ λ μ컬νκ²½ μΈμ€ν΄μ€λ foo();
μνμ΄ λλ μ΄ν GCκ° νμν΄μΌ νλλ° μ¬μ€μ κ·Έλ μ§ μλ€. μμ μ€λͺ
νλ― bar
λ μ¬μ ν λ°κΉ₯ λ μ컬 νκ²½μΈ foo
μ λ μ컬 νκ²½μ κ³μ μ°Έμ‘°νκ³ μκ³ , μ΄ bar
λ baz
κ° μ¬μ ν μ°Έμ‘°νκ³ μκΈ° λλ¬Έμ΄λ€.(baz(=bar) -> foo
)
function count() {
var i;
for (i = 1; i < 10; i += 1) {
setTimeout(function timer() {
console.log(i);
}, i * 100);
}
}
count();
μ΄ μ½λλ 1, 2, 3, ... 9λ₯Ό 0.1μ΄λ§λ€ μΆλ ₯νλ κ²μ΄ λͺ©νμλλ°, κ²°κ³Όλ‘λ 10
μ΄ 9λ² μΆλ ₯λμλ€. μμΌκΉ?
timer
λ ν΄λ‘μ λ‘ μΈμ μ΄λμ μ΄λ»κ² νΈμΆλλμ§ νμ μμ μ€μ½νμΈ count
μκ² i
λ₯Ό μλ €λ¬λΌκ³ μμ²ν κ²μ΄λ€. κ·Έλ¦¬κ³ timer
λ 0.1μ΄ ν νΈμΆλλ€. κ·Έλ°λ° 첫 0.1μ΄κ° μ§λ λμ μ΄λ―Έ i
λ 10
μ΄ λμλ€. κ·Έλ¦¬κ³ timer
λ 0.1μ΄ μ£ΌκΈ°λ‘ νΈμΆλ λλ§λ€ νμ count
μμ i
λ₯Ό μ°Ύλλ€. κ²°κ΅, timer
λ μ΄λ―Έ 10
μ΄ λμ΄λ²λ¦° i
λ§ μΆλ ₯νκ² λλ€.
κ·ΈλΌ μλλλ‘ 1~9κΉμ§ μ°¨λ‘λλ‘ μΆλ ₯νκ³ μΆμΌλ©΄ μ΄λ»κ² ν΄μΌν κΉ?
μ΄λ κ² λ κ°μ§κ° μμ κ²μ΄λ€.
λ€μ μ½λλ μλ μλλλ‘ λμνλ€.
1.
function count() {
var i;
for (i = 1; i < 10; i += 1) {
(function(countingNumber) {
setTimeout(function timer() {
console.log(countingNumber);
}, i * 100);
})(i);
}
}
count();
2.
function count() {
"use strict";
for (let i = 1; i < 10; i += 1) {
setTimeout(function timer() {
console.log(i);
}, i * 100);
}
}
count();