for(let i =0; i <collection.length; i++) {iteratee(collection[i],function(error){if(error) returncallback(error); count +=1;if(count ===collection.length) callback(null);});}
병렬이라 for로 돌렸다. 하지만 var로 할경우엔 오직 collection.length만 찍히지만, let으로 할경우 클로저가 발생되어 iteratee가 블록스코프인 let을 계속 지켜보고 또 let또한 for를 돌때마다 계속 블록이 생성되어 그 스코프정보가 저장된다. 그래서 비동기로 호출하여도 원하는 i값을 가질 수 있다.
이 방법외에
함수로 감싸서 외부함수 내부함수 구조로 만들어 클로저 만들기
이렇게 실행할 수 있다. 또는..
즉시실행 함수를 사용하기
Array와 Object를 구분해서 짜기
length를 구할때는
로 length값을 구한다.
Object.values() 를 사용하자
const keys = Object.keys(collection)을 사용했었는데 이러면 collection[keys[num]]으로 복잡해진다. 또한 Array.isArray()를 사용해야하는 이유는, 객체의 key값이 숫자일 경우 collection[숫자]를 피해갈 수 없기 때문에 꼭 써줘야 한다.