Javascript 词汇范围
Javascript Lexical scope
我试图理解词汇范围的概念。据我所知,词汇范围不能向后工作。在下面的javascript代码中,我在scope3()函数中声明了变量"name"。但我尝试在 scope1() 和 scope2() 函数中调用它。由于词法范围不能向后工作,我应该得到"名称未定义",但它返回空字符串。有人可以解释一下吗?
var scope1 = function () {
// name should have been undefined but its printing empty string
console.log(name);
var scope2 = function () {
// name should have been undefined but its printing empty string
console.log(name);
var scope3 = function () {
var name = 'Todd'; // locally scoped
};
};
scope2();
};
scope1();
JavaScript 具有名称内置属性。因此,当您尝试获取指向window.name
的变量时name
您将获得一个空字符串。
您需要使用其他内容而不是名称。
您需要正确理解词汇范围,下面是一个简短而直接的示例来解释该概念及其工作原理:
比方说:
function(auto) {
var vehicle = "bus";
console.log(vehicle);
function(innerAuto) {
console.log(vehicle)
}
innerAuto();
}
auto();
因此,在此上下文中称为 innerAuto
的内部函数会获得一条指令来记录 Vehicle 的值,该值无处可寻,该函数立即知道它应该转到外部范围找到它。 即 JS 运行时已经知道,在执行此代码时,无需在 innerAuto
函数内部查看变量车辆的声明。所以你想知道它怎么知道这一点?这是因为在编译期间,它没有在innerAuto
函数中看到变量声明,而是在auto
函数中看到它。因此,词法范围只是编译时范围。有关更多信息,请查看有关词汇范围和闭包的 MDN 文档。
>name
是依赖于实现的JavaScript对象的预定义名称列表的一部分。因此,它不会提供您期望的引用错误。将绑定name
更改为names
以查看预期的引用错误。
您对词汇范围的逻辑理解也是绝对正确的。词法(或静态)作用域,提供函数(或块)来查看其父函数(或块)的绑定。但是,父函数(或块)没有在其子函数中创建的绑定的视图。另一方面,全局绑定对所有人都是可见的。
希望有帮助,谢谢!
- 正在全局范围中查找JavaScript函数
- 如何通过数组更新角度子范围
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- HTML范围:动态设置值属性
- "实例范围”;TypeScript类的getter/setter
- jquery日期选择器年份范围默认值
- Jpgraph:如何手动设置X轴和Y轴的范围
- 在对象数组中查找多个值的d3范围
- 动态加载angularjs并生成控制器和范围
- 如何通过谷歌应用程序脚本从谷歌文档中的位置确定命名范围
- 在Materialize Calendar中设置年份范围
- 在MVVM视图模型中处理应用程序范围的元素
- setInterval游戏循环的范围问题
- AngularJS获取范围中的选定项目
- 从指定范围创建字符数组
- 糟糕的JavaScript词汇范围示例
- 角承诺的“then”函数的成功回调的词汇范围是什么?
- 帮助我理解这种结构(词汇范围)
- Javascript 词汇范围
- 试图在示例中理解词汇范围