2016-12-26 1 views
-1

이 코드는 작동 다음배열 항목의 함수 호출에서 "not a function"오류가 발생하는 이유는 무엇입니까?

function forEach (list, callback) { 
    for (var n = 0; n < list.length; n++) { 
    callback.call(list[n], n); 
    } 
} 

을 다음하지 않는 :

function forEach (list, callback) { 
    for (var n = 0; n < list.length; n++) { 
    list[n].callback(n); // Uncaught TypeError: 
          // list[n].callback is not a function 
    } 
} 

참고 : 각각의 경우에, callback는 하나 개의 인수와 익명 함수를 전달,과 같이 :

forEach(array, function(index) { 
    // log to console... 
}); 
+1

'list [n]'은'callback' 속성을 가진 객체가 아니기 때문에. – Barmar

+0

@Barmar 감사합니다. – Sabuncu

답변

2

자바 스크립트 이해를 JavaScript로

의미

  • 가져 오기로

    list[n]

  • 목록이 없기 때문에 n

을 통과하는 객체가 함수로 그 값을 호출

  • 을 가져온의 "콜백"라는 속성을 가져 오기 "callback"이라는 속성을 가진 객체를 포함하지 않으면 해당 오류가 발생합니다.

    귀하의 질문에 게시 된 작업 코드는 귀하가 알아 챘 듯이 콜백 기능을 호출하는 올바른 방법입니다. callback 매개 변수의 값은 호출 할 함수이며, 코드는 에 사용할 값으로 list[n] 값을 갖는 함수를 호출하기 위해 .call()을 사용합니다.

    이 같은 코드를 작성하는 정말 끔찍한 생각 것,하지만 (그것이 끔찍한 생각 것에 대한 이유있는 가능한 문제를 제외하고) 일 것이다 :

    function forEach (list, callback) { 
        for (var n = 0; n < list.length; n++) { 
        list[n].callback = callback; // <-- TERRIBLE IDEA - DO NOT DO 
        list[n].callback(n); 
        } 
    } 
    

    다시 은 유감스럽게도 버그가 발생할 가능성이 높기 때문에을 사용하지 않지만 "콜백"속성의 값을 목록의 각 개체에 명시 적으로 부여하므로 제대로 작동합니다.

  • +0

    자세한 설명을 부탁드립니다. – Sabuncu

    1

    이것은 list가 배열이고 사용하기 때문입니다. operator with list는 콜백이 객체이지만 콜백이 매개 변수로 전달됨을 나타냅니다.

    Javascript의 모든 함수에 호출 메서드가 있으므로 callback.call()이 적합합니다. 그것은 당신이 기능을 호출 할 수 있습니다.

    +0

    감사합니다. – Sabuncu

    +0

    환영 동생 :) – Codesingh

    관련 문제