【发布时间】:2023-04-01 09:56:01
【问题描述】:
我正在尝试理解词法范围的概念。据我所知,词法范围不能向后工作。在下面的 javascript 代码中,我在 scope3() 函数中声明了变量“名称”。但我试图在 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();
【问题讨论】:
-
将您的代码包装在
IIFE=>(function(){ /*your code*/ })()中并查看结果。名称是全局window对象的属性,因此您将获得""。在IIFE中,使用var定义的变量将引用局部变量..不是全局变量... -
@RayonDabre 但是,覆盖默认(全局)属性是不好的做法。
-
如果您适当地缩进,该代码将更更容易理解。
-
不,覆盖默认的全局属性是不错的做法。首先,他没有超越它。始终添加第二个新的全局属性。使用名为 name 的变量可能是在 i 旁边用于索引的最常见的 JavaScript 变量之一。
标签: javascript scope lexical-scope lexical-closures