Front-End/
Closure
taehyun_kim
2017. 6. 20. 20:29
1 2 3 4 5 6 7 8 9 10 11 12 13 | function makeAdders(n) { var adders = []; for ( var i = 0; i < n; i++) { adders.push( function (x) { return i + x; }); } return adders; } var adders = makeAdders(10); var add5 = adders[5]; var r = add5(2); console.log(r); // We expect 7, but 12 is printed. |
익명함수 ( i+x )를 만들 때 var i의 주인은 function makeAdders 이다. Javascript에서는 이 변수를 넘길 때 Closure라는 scope를 가지고 넘긴다. 외부함수 makeAdders의 변수 i에 접근할 수 있는 내부함수 function(x)을 Closure라 한다. 여기서 문제는 var i가 익명함수의 것이 아니라 function makeAdders의 var i를 가리키고 있다.
ES6의 let 을 사용하면 내가 아는 Block Scope을 가지게 된다. 문제해결!