Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于 const 和 let 声明的变量不在 window 上 #5

Open
lovelmh13 opened this issue Jan 29, 2020 · 0 comments
Open

关于 const 和 let 声明的变量不在 window 上 #5

lovelmh13 opened this issue Jan 29, 2020 · 0 comments

Comments

@lovelmh13
Copy link
Owner

letconst 声明的变量不能通过window找到,但是可以直接打印出来。

ES2020 在语言标准的层面,引入globalThis作为顶层对象。也就是说,任何环境下,globalThis都是存在的,都可以从它拿到顶层对象,指向全局环境下的this

顶层对象

在ES5中,顶层对象的属性和全局变量是等价的,var 命令和 function 命令声明的全局变量,自然也是顶层对象。

ES6 为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,**let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。**也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。

以下为ES5中,红宝书的解释

global 对象

不属于任何其他对象的属性和方法,最终都是 global 的属性和方法。

ECMAScript 虽然没有指出如何直接访问 Global 对象,但 Web 浏览器都是将这个全局对象作为window 对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,就都成为了 window 对象的属性。

window 对象

​ 在浏览器中,window对象既是js访问浏览器窗口的一个接口,又是global对象。

var age = 29; 
function sayAge(){ 
 alert(this.age); 
} 
alert(window.age); //29 
sayAge(); //29 
window.sayAge(); //29

​ 我们在全局作用域中定义了一个变量 age 和一个函数 sayAge(),它们被自动归在了 window 对象

名下。于是,可以通过 window.age 访问变量 age,可以通过 window.sayAge()访问函数 sayAge()。

​ 由于 sayAge()存在于全局作用域中,因此 this.age 被映射到 window.age,最终显示的仍然是正确

的结果。

window对象属性与全局变量的区别

  1. 全局变量不能用delete删除,window对象的属性可以

  2. 访问未声明的变量会抛错,但是通过window访问未声明的的变量(属性),不会抛错

    //这里会抛出错误,因为 oldValue 未定义
    var newValue = oldValue; 
    //这里不会抛出错误,因为这是一次属性查询
    //newValue 的值是 undefined 
    var newValue = window.oldValue;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant