2016-08-12 2 views
1
var funcs = [] 
[1, 2].forEach((i) => funcs.push(() => i )) 

왜 아래 오류가 발생합니까? 세미콜론 ;가 제 1 라인의 마지막에 추가하는 경우정의되지 않은 'forEach'속성을 읽을 수 없습니다.

TypeError: Cannot read property 'forEach' of undefined 
    at Object.<anonymous> 

그러나 오류가 사라진다.

+2

줄에 세미콜론을 추가해야합니다. 이 코드는'var funcs = [] [1, 2] .forEach ... '로 보여졌습니다. – epascarello

+1

'.forEach()'대신'.map()'을'var funcs = [1 , 2] .map ((i) =>() => i)'세미콜론으로 인한 문제를 피하기 위해서 – guest271314

답변

11

첫 번째 줄 끝에는 세미콜론이 없습니다. 그래서 두 줄이 함께 실행하고,이

[][1, 2].forEach((i) => funcs.push(() => i )) 

표현에 funcs의 설정 값으로 해석됩니다 당신이 빈 상태 (empty)의 배열의 인덱스 2에 액세스하려는 있도록 1, 2, 단지 2 (comma operator)이된다 :

[][2] // undefined 

undefined에는 forEach 메서드가 없습니다. 이 문제를 해결하려면 줄 끝 부분에 세미콜론을 넣어야합니다. 그렇지 않으면 수행중인 내용을 확실히 알고 있어야합니다.

+0

"표현식 1, 2는 단지 2가됩니다." – naveen

+1

@naveen JavaScript는 'a, b, c'와 같은 표현식을 보게되면 모든 하위 표현식을 순서대로 'a'다음에 'b'다음에 'c'로 평가 한 다음 마지막 하위 값을 반환합니다 -expression ('c'). 이것은 유용하다. 'for' 루프의 첫 번째 줄처럼 이전 표현식이 표현식 만 허용되는 상황에서 부작용에 사용되는 경우입니다. – rvighne

+2

세미콜론을 사용해야하는 이유에 대한 고전적인 예가 필요하지 않은 경우가 많이 있습니다. – jfriend00

0

funcs의 변수 선언에 변수에 속한 것으로 인스턴스화 한 익명 배열이 포함되지 않도록하고 배열의 모든 요소를 ​​'funcs'로 푸시하려고하는 경우 세미콜론을 유지하십시오. 다음과 같이 표시되어야합니다 :

[1, 2].forEach((i) => funcs.push(i)) 
+0

숫자를 반환하는 함수로 숫자를 변환하는 것은 상당히 의도적 인 변수 이름에서 오히려 분명하다고 생각합니다. 사실이 아니라면, 명백한 해결책은 단순히 'var funcs = [1, 2];' – HonoredMule

관련 문제