scope, var closure 이슈, let, const
var list = document.querySelectorAll('li') for(var i = 0; i < 4; ++i) { list[i].addEventListener("click", function() { console.log(i + "번째 리스트입니다") }) // 클릭하면 4 4 4 4 나옴 } for루프의 i가 전역변수라서 4가 출력된다. for(var i = 0; i < 4; ++i) { (function (idx) { list[idx].addEventListener('click', function() { console.log(idx) }) }(i)) } IIFE로 작성할 수 있다(정의와 동시에 실행). var의 함수레벨 스코프로 인하여 for 루프의 초기화식에 사용된 변수가 전역스코프를 가져서 발생하는 문제를 회피하기 위해 클로저를 이용함 (클로저 - 반환된 내부함수가 자신의 선언됬을 때의 환경(lexical environment)인 스코프를 기억하여 자신이 선언됬을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수) for(let i = 0; i < 4; ++i) { list[i[.addEventListener('click', function() { console.log(i) }) } for루프의 let i 변수는 for루프에서만 유효한 지역변수이다. 하지만 for루프가 종료되어도 자유변수 i를 참조하는 함수가 존재하면 계속 유지된다const list = ['a', 'b', 'c'] list2 = [].concat(list, 'd') console.log(list === list2) // false
Last updated