let a = 1
function f () {
console.log(a, b, c)//#1
let b = 2
console.log(a, b, c)//#2
if (true) {
let c = 3
console.log(a, b, c)//#3
}
console.log(a, b, c)//#4
}
f()
각각의 console.log(a, b, c)의 값은 어떻게 될까?
<여기서 알 수 있는점>
let은 block scope에 영향을 받는다.
let은 TDG에 갇힌다.
var funcs = []
for (var i = 0; i < 10; i++) {
funcs.push(function () {
console.log(i)
})
}
funcs.forEach(function (f) {
f()
})
먼저 forEach의 특성부터 살펴보자
arr.forEach(callback(currentvalue[, index[, array]])[, thisArg])
arr.forEach(function (element) {
console.log(element)
})
이 특성과 같이 element는 arr에 들어있는 값들을 function의 매개변수로 사용하는 것이다.
그렇다면 위의 코드들은 어떤식으로 작동하며 값은 뭐가나오는지 알아보자.
1. funcs = []이 정의된다.
2. for문을 돌며 funcs안에 function(){}이 10개 들어간다. (그러나 function안의 내용은 실행되지 않는다. 함수를 실행한적이 없고 그냥 funcs안에 넣어주기만 했기 때문이다.)
3. for문을 다 돌면 i는 10이 된다.
i=9일때 for안의 내용은 실행이 되고 그 다음 i<10을 만족하므로 i=10이 되지만 i<10을 만족하지 못하므로 for안의 내용은 실행되지 않는다.
4. forEach가 실행되면 funcs안의 함수들이 실행된다. i는 var로 선언했으므로 block scope의 영향을 받지않는다 그러므로 i=10을 console.log(i)에 적용할 수 있다.
결과: 10이 10번나온다.
위의 문제에서 0~9까지의 숫자가 나오게 하려면 어떻게 할까?
var funcs = []
for (var i = 0; i < 10; i++) {
funcs.push((function (v) {
return function () {
console.log(v)
}
})(i)) //즉시실행함수
//i를 매개변수로 v로 바로 넘겨준다.
}
funcs.forEach(function (f) {
f()
})
방법은 funcs에 function(v)를 넣으면서 매개변수를 i로 하는 함수를 실행시켜준다.
그러면 funcs에는 function(){ console.log(i)}가 10개 담기게 될 것이다.
물론 i는 0~9까지 숫자가 담길 것이다.
let funcs = []
for (let i = 0; i < 10; i++) {
funcs.push(function () {
console.log(i)
})
}
funcs.forEach(function (f) {
f()
})
let을 사용할시 block scope에 의해서 for문의 i값마다 각각의 스코프를 실행한다.
funcs.push(function () {
console.log(i)
})
즉 이 부분을 i값마다 생성한다.
그러므로 i의 값이 0~9까지 차례로 들어갈 수 있다.
결과: 0~9