回调函数的词法范围
Lexical scope of callback function
有人可以向我解释为什么在传递给过滤器函数的回调中,开始日期和结束日期不在范围内。
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的开发工具,当您点击调试器时,您将无法访问startDate
和endDate
。
这只是浏览器正在执行的优化,因为它在代码中看不到对这些函数的任何访问。
验证这一点的一种快速方法是在debugger
语句上方放置一个控制台语句:
console.log(startDate);
debugger; // now you will be able to access startDate
您对词汇范围的理解是正确的...您只是在进行运行时浏览器优化。
有关详细信息,请参阅此 chrome 问题报告。
相关文章:
- 正在全局范围中查找JavaScript函数
- 如何通过数组更新角度子范围
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- HTML范围:动态设置值属性
- "实例范围”;TypeScript类的getter/setter
- jquery日期选择器年份范围默认值
- Jpgraph:如何手动设置X轴和Y轴的范围
- 在对象数组中查找多个值的d3范围
- 动态加载angularjs并生成控制器和范围
- 如何通过谷歌应用程序脚本从谷歌文档中的位置确定命名范围
- 如何在词法环境中管理块范围
- 我怎样才能创建一个函数expr;t继承词法范围
- 回调函数的词法范围
- 命名空间和词法范围之间的关系是什么
- 了解回调和相关词法范围
- JavaScript中的词法范围,变量生存期和承诺
- javaScript 中的词法范围/闭包
- 如何强制React ES6静态方法's '绑定到词法范围
- Chrome中的ES6 - Babel源地图和箭头函数的词法范围
- 我无法理解“简化 JavaScript 中的函数是具有词法范围的 lambda”