我试图理解词汇范围的概念。据我所知,词汇范围不会倒退。在下面的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();
答案 0 :(得分:0)
JavaScript具有name内置属性。因此,当您尝试获取name
变量时,您将获得一个空字符串,因为它指向window.name
。
你需要使用其他东西而不是名字。
答案 1 :(得分:0)
您需要正确理解词法范围,下面是一个简短而直接的例子来解释这个概念及其工作原理:
让我们说:
function(auto) {
var vehicle = "bus";
console.log(vehicle);
function(innerAuto) {
console.log(vehicle)
}
innerAuto();
}
auto();
因此,在此上下文中调用innerAuto
的内部函数会获取一条指令,用于记录车辆的值,这是无处可寻的,函数立即知道它应该转到外部范围来查找它。即JS运行时已经知道在执行此代码时,无需查看innerAuto
函数内部的可变车辆声明。所以你想知道它是怎么知道的?这是因为在编译期间它没有在innerAuto
函数中看到变量声明,而是在auto
函数中看到它。所以词法范围只是编译时间范围。有关详细信息,请查看有关词法范围和闭包的MDN文档。
答案 2 :(得分:0)
name
是与实现相关的JavaScript对象的预定义名称列表的一部分。因此,它不会提供您期望的参考错误。将绑定name
更改为names
,以查看预期的参考错误。
您在逻辑上对词汇范围的理解也是绝对正确的。词法(或静态)作用域提供函数(或块)以查看其父函数(或块)的绑定。但是,父函数(或块)无法查看在其子级中创建的绑定。另一方面,全局绑定对所有人都是可见的。
希望能有所帮助,谢谢!