回调函数的词法作用域
Lexical scope of callback function
有人可以向我解释为什么 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 在范围内。 callbacks/inline 函数的词法范围是否与函数声明不同?
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 的开发工具,当您点击调试器时,您无法访问 startDate
和 endDate
。
这只是浏览器正在进行的优化,因为它在您的代码中看不到对这些函数的任何访问。
验证这一点的一种快速方法是在 debugger
语句上方放置一个控制台语句:
console.log(startDate);
debugger; // now you will be able to access startDate
您对词法作用域的理解是正确的...您只是进行了运行时浏览器优化。
有关详细信息,请参阅 this chrome issue report。
有人可以向我解释为什么 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 在范围内。 callbacks/inline 函数的词法范围是否与函数声明不同?
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 的开发工具,当您点击调试器时,您无法访问 startDate
和 endDate
。
这只是浏览器正在进行的优化,因为它在您的代码中看不到对这些函数的任何访问。
验证这一点的一种快速方法是在 debugger
语句上方放置一个控制台语句:
console.log(startDate);
debugger; // now you will be able to access startDate
您对词法作用域的理解是正确的...您只是进行了运行时浏览器优化。
有关详细信息,请参阅 this chrome issue report。