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을 가지게 된다. 문제해결!
'Front-End > ' 카테고리의 다른 글
| Web Worker(웹 워커) - 멀티 스레드 쓰고 싶어! (0) | 2018.02.21 |
|---|---|
| Prototype, Object 이해하기 (0) | 2017.11.04 |
| Shadow DOM (0) | 2017.04.28 |
| 문서 스크립팅 (0) | 2017.04.27 |
| Section 5:Object-Oriented Javascript and Prototypal Inheritance (0) | 2017.04.25 |