Javascript词汇范围
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript词汇范围相关的知识,希望对你有一定的参考价值。
我试图理解词汇范围的概念。据我所知,词汇范围不会倒退。在下面的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有name内置属性。所以,当你试图获得name
变量时,你会得到一个空字符串,因为它指向window.name
。
你需要使用别的东西而不是名字。
您需要正确理解词法范围,下面是一个简短而直接的示例来解释概念及其工作原理:
让我们说:
function(auto) {
var vehicle = "bus";
console.log(vehicle);
function(innerAuto) {
console.log(vehicle)
}
innerAuto();
}
auto();
因此,在此上下文中称为innerAuto
的内部函数获取一条指令,用于记录车辆的值,这是无处可寻的,函数立即知道它应该转到外部范围以找到它。即JS运行时已经知道在执行此代码时,无需查看innerAuto
函数内部的可变车辆声明。所以你想知道它是怎么知道的?这是因为在编译期间它没有在innerAuto
函数中看到变量声明,而是在auto
函数中看到它。所以词法范围只是编译时间范围。有关更多信息,请查看有关词法范围和闭包的MDN文档。
name
是依赖于实现的JavaScript对象的列表预定义名称的一部分。因此,它不会提供您期望的参考错误。将绑定name
更改为names
以查看预期的参考错误。
你对词汇范围的逻辑理解也绝对正确。词法(或静态)范围提供了查看其父函数(或块)的绑定的函数(或块)。但是,父函数(或块)不具有在其子项中创建的绑定的视图。另一方面,全局绑定对所有人都是可见的。
希望有所帮助,谢谢!
以上是关于Javascript词汇范围的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段12——JavaScript的Promise对象