함수들을 배열에 저장하는 부분에서 let i로 선언한 값들이 어떻게 함수내에 저장되는지 잘 이해가 안갑니다.
293
작성한 질문수 6
let funcs = []
for (let i = 0; i < 10; i++) {
funcs.push(function() {
console.log(i)
})
}
funcs.forEach(function(f) {
f()
})
forEach로 f함수를 실행시키는 부분에서 i의 스코프가 어디서 살아 있는 건가요?
제가 이해하기로는 funcs = [ ..., function() { console.log(i) }, ...]로 i에 대한 값은 없이 함수만 저장되어 있고 forEach로 실행시키는 부분에서는 for문 밖에서 실행시키기 때문에 for 문의 스코프에 영향을 받지 않을 것이라 예상되는데 만약 i가 for 문의 스코프에 영향을 받는다면 어떤 방식으로 받는 것인지, 그것이 왜 메모리 측면에서 효율적인지 알고 싶습니다!
답변 3
2
위 답변은 틀렸습니다. 제대로 이해하려면 강의를 다시 봐주시기 바랍니다.
아래는 위 답변에서 잘못된 내용을 정정하여 기재합니다.
---------------------------------------------------------------------
for문에서 i 값이 변경되는 매 루프마다 각각 새로운 블록스코프가 형성됩니다.
즉 아래와 같은 내용이 반복되는 형태로 생각하면 됩니다.
for (let i = 0; i < 10; i++) {
funcs.push(function() { console.log(i); });
}
// ==================
let i = 0;
{
funcs.push(function(){ console.log(i); });
i = 1;
}
{
funcs.push(function(){ console.log(i); });
i = 2;
}
{
funcs.push(function(){ console.log(i); });
i = 3;
}
...
1
for문에서 i 값이 변경되는 매 루프마다 각각 새로운 블록스코프가 형성됩니다.
즉 아래와 같은 내용이 반복되는 형태로 생각하면 됩니다.
for (let i = 0; i < 10; i++) {
funcs.push(function() {
console.log(i)
})
}
// ==================
{
let i = 0;
funcs.push(function(){ console.log(i); });
}
{
let i = 1;
funcs.push(function(){ console.log(i); });
}
{
let i = 2;
funcs.push(function(){ console.log(i); });
}
...
i 값이 for문 종료 이후에도 for문의 scope의 영향을 받는 경우와 같은 개념은
실행컨텍스트와 클로저에 대한 내용입니다. 이에 대해 학습이 필요하시다면
시중의 교재 또는 제 다른 강의인 '자바스크립트 흐름파악하기' 강좌를 참고하시기 바랍니다.
메모리 측면에서 효율적이라는 내용은 아래의 코드(ES5 하에서의 코드)와 비교하면 그렇다는 것입니다.
for (var i = 0; i < 10; i++) {
(function (i) {
funcs.push(function(){ console.log(i); });
})(i);
}
이 경우 i를 전달하기 위해 매번 즉시실행함수를 한 번 더 감싸기 때문에 상대적으로 성능이 저하될 수밖에 없겠죠.
프로토타입 체이닝에 대해서
0
376
1
react 사용할 때 destructuring assignment라고 하는거 진짜 많이 사용 했는데 신기합니다.
0
520
1
2023-10-30일 기준 Object Rest/Spread Properties 적용 됬나봐요. 짱신기
0
336
1
제가 이해한 부분이 혹시 맞는지 알 수 있을까요?
0
310
2
블록스코프 내에서 펑션을 선언해서 사용하는경우가 있나요?(실무)
0
346
1
클래스에서 화살표함수?
0
1218
2
default parameter TDZ
0
278
1
강의 자료
1
304
2
전개 연산자 얕은 복사 질문
0
276
1
궁금한게 있는데요 ..
0
305
2
궁금한게 잇는데요 여기서 this는 array값을 출력해주나요?
0
357
1
template literal 강의에서의 reduce 메소드
0
310
2
다운로드 받은파일
0
284
1
const 이럴때도 사용하나요?
0
384
1
순서정렬
0
233
1
함수선언문 말고 arrow function
0
259
1
this바인딩 질문
1
265
1
에로우함수 new.target
0
206
2
함수표현식질문
0
222
1
rest parameter장점
0
310
1
if(exps[i])
0
190
1
좋은강의 감사합니다 이거는 호이스팅이 실행안되는거 같은데
0
302
3
해체하여 적용하려는 대상은 해체하는 대상의 타입에 매칭해야하나요?
0
170
1
강의노트 없습니다.
0
231
1





