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