词法回调函数的范围

时间:2016-03-29 12:00:26

标签: javascript scope lexical-scope

有人可以向我解释为什么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);
}

1 个答案:

答案 0 :(得分:1)

我看到你有一些调试器语句。

也许你正在使用Chrome的开发工具,当你点击调试器时,你无法访问startDateendDate

这只是浏览器正在进行的优化,因为它没有在您的代码中看到这些功能的任何访问权。

验证这一点的一种快捷方法是将控制台语句置于debugger语句之上:

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

您对词汇范围的理解是正确的 ...您只是在进行运行时浏览器优化。

有关详细信息,请参阅this chrome issue report