2016-03-29 134 views
2

有人可以向我解釋爲什麼startDate和endDate不在範圍內傳遞給過濾函數的回調函數中。回調函數的詞法範圍

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; 
    }); 
} 

當我將代碼更改爲下面的工作。 starDate和endDate在範圍內。回調函數/內聯函數的詞法範圍是否與函數聲明不同?

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

也許,但這只是一個猜測,這是因爲您聲明並分配了'events'first(filterData'外部),稍後在'filterData'中聲明'startDate'和'endDate'。這可能是吊裝的問題嗎?嘗試在'filterData'函數內聲明'events'在哪裏使用它 – Pimmol

回答

1

我看到你在那裏有一些調試器語句。

也許您正在使用Chrome的開發工具,當您點擊調試器時,您無法訪問startDateendDate

這只是一個優化,瀏覽器正在做,因爲它沒有看到你的代碼中的這些函數的任何訪問。

一個快速的方法來驗證,這是把一個控制檯上述聲明您debugger聲明:

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

你的詞彙範圍的理解是正確的 ...你只是打一個運行時瀏覽器的優化。

欲瞭解更多信息,請參閱this chrome issue report