在全局中使用let定义的变量,不存在于window对象,存在于哪

在全局中使用let定义的变量,不存在于window对象,存在于哪?

var a = "xyc";
console.log(window.a);// "xyc"

let b = "lxy";
console.log(window.b);// "undefined"

const c = "lxyc";
console.log(window.c);// "undefined"

因为在全局使用let定义变量时,该变量不再属于全局属性
那么,问题来了,既然他们不属于全局属性,那他们存在于哪,能否打印证明
求大神指教!

回复
阅读 7.4k
5 个回答

查找资料时,在高程书中看到这样一句话:

Global(全局)对象可以说是ECMAScript 中最特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的。ECMAScript中的Global对象在某种意义上是作为一个终极的“兜底儿对象”来定义的。换句话说,不属于任何其他对象的属性和方法,最终都是他的属性和方法。
似乎也能稍作解释

以chrome 控制台为例,console输入的都会包裹在一个script里执行,所以debugger的时候会有两层作用域,而let是局部的不是全局的,只存在于script作用域,所以就是你看到的那样

图片描述

如果我们把JS运行的环境想象成一篇无边无际的平地(global)
那window对象就是平地上的一个院子,绝大多数东西,都在这个院子里,例如:window.alert(), window.document 之类的

  1. 我们定义一个

    var a = 1;

    那么它就是 window.a

  2. 如果定义一个

    let b = 2;

    那么它是 b, 用 window.b 是访问不到的

到这里你可能明白了些什么,但是令人疑惑的事情又发生了
TIM截图20191010092624.jpg

a是在window下的变量,b是在global下的变量,结果都可以直接被访问到。可见,js运行时默认有个import window.* 的操作,将window下的成员全部提升为global级别了

let 在全局中创建的变量存在于Script中,它与window(Global)平级,
var 在全局中创建的变量存在于window(Global)中;
clipboard.png

新手上路,请多包涵

我们说的一般的全局指的是script级别上的全局,而window是一个基于script上的全局,通常写代码都不会在一window这个对象,var定义的变量存在提升特性,可以把script理解成一个代码块,在script中定义的变量会被提升至window这个全局上来,而let变量只会在script这个全局中访问到,同理,我试过用const定义一个变量,结果和let一致,这个理解希望对你有点帮助

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏