2016-03-29 9 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を参照してください。