此查询与存储结构相关,但不了解let
关键字的范围规则。
使用var
关键字,a
是window
对象的属性(如字典)
var a = 10;
console.log(window.a); // 10
console.log(window['a']) // 10
f
是window
对象
function f(){}
console.log(window['f']) // function object
使用let
关键字,b
不是window
字典的属性
let b = 20;
console.log(window.b); // undefined
我的理解是,JavaScript代码中引入的任何名称(函数/ var / ..)都是window
字典(嵌套)对象的属性(成员)。
修改
谁的财产是b
?
答案 0 :(得分:1)
您提供的所有代码都与“词典”无关。
var
与let
确定变量的范围。对于var
,变量的范围限定为其包含的函数(如果在所有函数之外,则为全局范围)。
let
给出了变量块级范围,它可以比函数级范围更精细(即if
/ else
语句的分支)。
如果声明属于全局范围,则let
与var
不会产生任何差异,因为范围是全局的。
两个声明都将创建全局变量,但let
未在window
对象上显式创建命名属性,如var
所示。
有关详细信息,请参阅 this 。
同样来自 MDN :
let
允许您声明范围有限的变量 使用它的块,语句或表达式。这与此不同var
关键字,它全局定义变量,或者本地定义变量 整个函数,无论块范围如何。
而且,来自 ECMAScript spec. 本身:
let
和const
声明定义了作用域的变量 运行执行上下文的 LexicalEnvironment 。
var
语句声明作用域的变量 执行上下文的 VariableEnvironment 。
这就是为什么全局声明的let
变量无法通过window
访问,就像全局声明的var
变量一样。