정렬 알고리즘을 공부를하다가 반복문 안에서의 var 변수와 let 변수의 범위에 대해 궁금하여 다시 강의를 듣던 중, 헷갈리는 설명이 있어 질문 남깁니다.
for (var i = 1; i < 6; i++) { setTimeout(function() { console.log(i); }, i*1000 ); }
for (let i = 1; i < 6; i++) { setTimeout(function() { console.log(i); }, i*1000 ); }
위 문제의 해법은 var를 let으로 바꾸면 된다고 설명해 주셨는데 그 이유가 var를 사용한 반복문이랑 let을 사용한 반복문의 차이는 단지 let의 범위가 var과는 다르게 중괄호에서만 사용 가능해서 인가요? var를 사용한 반복문이 실행되고 남은 자리에는 var = 6 이라는 전역변수가 생긴다고 하셨는데 왜 전역변수가 생성이 되는 건가요? var을 사용하여 만든 반복문과 let을 사용하여 만든 반복문의 차이를 알려주시면 감사하겠습니다.
그리고
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
let currentVal = arr[i];
for (var j = i - 1; j >= 0 && arr[j] > currentVal; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = currentVal;
}
return arr;
}
위 함수에서 내부 반복문에서 let을 사용하면 당연히 let의 범위를 벗어나기에 7번째 줄의 실행되면 j가 정의되지 않았다는 오류가 뜨는데, let을 var로 바꾸어 실행하면 문제없이 잘 실행되는데 여기서 let이 아닌 var을 사용했을 때 어떤 이유로 작동이 잘되는 건지 설명해주시면 감사하겠습니다 !!