Javascript 回调函数的词法范围

Javascript 回调函数的词法范围,javascript,scope,lexical-scope,Javascript,Scope,Lexical Scope,有人能解释一下为什么startDate和endDate不在传递给filter函数的回调的作用域中吗 var events = [], eventsDataSource = [], statusChstatusChanges = [], statusChangesDataSource = []; function filterData() { var startDate = $('#start-date').data("kendoDatePicker").value();

有人能解释一下为什么startDate和endDate不在传递给filter函数的回调的作用域中吗

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);
}
函数filterData(){
var startDate=$(“#开始日期”).data(“kendoDatePicker”).value();
var endDate=$('#end date').data(“kendoDatePicker”).value();
函数日期介于启动和结束(项){

returnnewdate(item.Date)>=newdate(startDate)&newdate(item.Date)我看到您有一些调试器语句

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

这只是浏览器正在进行的优化,因为在代码中看不到对这些函数的任何访问

验证这一点的快速方法是在
调试器的
语句上方放置一个console语句:

console.log(startDate);
debugger; // now you will be able to access startDate
您对词法范围的理解是正确的…您正在进行运行时浏览器优化


有关更多信息,请参见。

可能,但这只是猜测,因为您首先声明并分配
事件
(在
过滤器数据
之外),然后在
filterData
中声明
startDate
endDate
。这可能是起重问题?请尝试在
filterData
函数中声明使用它的
事件