关于JavaScript中Lexical Scoping下let变量嵌套声明未报错的疑问
关于JavaScript中Lexical Scoping下let变量嵌套声明未报错的疑问
嘿,我来给你把这个问题掰扯清楚!你之所以觉得应该报错,是对**词法作用域(Lexical Scoping)**和let的作用域规则有点小误解~
首先,词法作用域的核心是:变量的作用域由它在代码中声明的位置决定,内层作用域可以访问外层作用域的变量,但反过来不行。但这完全不意味着内层作用域不能声明和外层同名的变量——恰恰相反,内层作用域声明的同名变量会**遮蔽(shadow)**外层的变量,而不是触发报错。
咱们来看你的代码:
function demoFunction() { let x = 10; // 这是demoFunction作用域的x function demo() { let y = 20; let x=5; // 这是demo函数作用域的x,和外层的x完全是两个独立变量 console.log(x); // 输出内层的5 console.log(y); // 输出20 } console.log(x); // 输出外层的10 demo(); } demoFunction();
这里的关键是:demo函数是一个独立的函数作用域,它和外层demoFunction的作用域是完全分离的两个变量环境。你在demo里声明的let x=5,是在这个内层作用域里新建了一个变量,和外层作用域的x没有任何关系——它们只是名字相同而已,本质是两个不同的变量。
那什么时候let会报错呢?只有当你在同一个作用域内重复声明同一个变量的时候才会触发,比如下面这种情况:
function demo() { let x = 10; let x = 5; // 同一作用域重复声明,这里才会报错! }
总结一下:词法作用域允许内层作用域声明同名变量来遮蔽外层,这是正常的语言特性,不是错误;只有同一作用域内的重复let声明才会抛出语法错误。
备注:内容来源于stack exchange,提问作者lakshya
相关产品推荐
相关产品推荐

