javascript - 回调函数的词法作用域

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

最佳答案

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

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

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

验证这一点的一种快速方法是将控制台语句放在 debugger 语句之上:

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

您对词法作用域的理解是正确的...您只是在进行运行时浏览器优化。

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

关于javascript - 回调函数的词法作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36283686/

相关文章:

javascript - 仅选择/取消选择可见复选框

javascript - 单击设置后从播放更改为暂停

javascript - 将表行移动到另一个表

lisp - 符号和名称不同吗?

javascript - 如何在 OSA 事件处理程序中将 'using terms from ...' 转换为 Javascript

php - 为什么我定义的变量未定义

python - Python中默认参数的范围是什么?

java - Eclipse IDE 范围突出显示?

javascript - 为什么当我使用 setTimeout 方法时变量不保留?