2016-03-29 13 views
2

könnte mir jemand erklären, warum StartDate und EndDate sind nicht im Umfang in Callback an Filterfunktion übergeben.Lexikalischer Umfang der Callback-Funktion

var events = [], 
eventsDataSource = [], 
statusChstatusChanges = [], 
statusChangesDataSource = []; 

function filterData() { 
    var startDate = $('#start-date').data("kendoDatePicker").value(); 
    var endDate = $('#end-date').data("kendoDatePicker").value(); 

    events = eventsDataSource.filter(function (item) { 
     debugger; 
    }); 
    statusChanges = statusChangesDataSource.filter(function (item) { 
     debugger; 
    }); 
} 

wenn ich Code änderte, was unten funktioniert hat. StarDate und EndDate sind im Umfang. Ist der lexikalische Umfang der Callbacks/Inline-Funktion anders angelegt als die Funktionsdeklarationen?

function filterData() { 
    var startDate = $('#start-date').data("kendoDatePicker").value(); 
    var endDate = $('#end-date').data("kendoDatePicker").value(); 

    function dateIsBetweenStartAndEnd(item) {    
     return new Date(item.Date) >= new Date(startDate) && new Date(item.Date) <= new Date(endDate); 
    } 

    events = eventsDataSource.filter(dateIsBetweenStartAndEnd); 
    statusChanges = statusChangesDataSource.filter(dateIsBetweenStartAndEnd); 
} 
+0

Vielleicht, aber es ist nur eine Vermutung, weil Sie 'events'first (außerhalb' filterData') deklarieren und zuweisen, und später in 'filterData' deklarieren Sie' startDate' und 'endDate'. Es könnte ein Problem mit dem Heben sein? Versuchen Sie, die 'Ereignisse' zu ​​deklarieren, in denen Sie sie verwenden, innerhalb der 'filterData'-Funktion – Pimmol

Antwort

1

Ich sehe, Sie haben einige Debugger-Anweisungen drin.

Vielleicht verwenden Sie die dev-tools von Chrome. Wenn Sie den Debugger drücken, können Sie nicht auf startDate und endDate zugreifen.

Dies ist einfach eine Optimierung, die der Browser macht, weil es keinen Zugriff auf diese Funktionen in Ihrem Code sieht.

Eine schnelle Möglichkeit, dies zu überprüfen, ist eine Konsole Aussage über Ihre debugger Anweisung setzen:

console.log(startDate); 
debugger; // now you will be able to access startDate 

Ihr Verständnis von lexikalischen Gültigkeitsbereich richtig ist ... Sie werden einen Laufzeit Browser-Optimierung nur schlagen.

Weitere Informationen finden Sie unter this chrome issue report.