ES6学习笔记之1顶层对象的概念

news/2024/7/11 0:06:34 标签: es6

作者:阮一峰 

原文地址ES6 入门教程

顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象。ES5 之中,顶层对象的属性与全局变量是等价的。

window.a = 1;
a // 1

a = 2;
window.a // 2

上面代码中,顶层对象的属性赋值与全局变量的赋值,是同一件事。

顶层对象的属性与全局变量挂钩,被认为是 JavaScript 语言最大的设计败笔之一。这样的设计带来了几个很大的问题,首先是没法在编译时就报出变量未声明的错误,只有运行时才能知道(因为全局变量可能是顶层对象的属性创造的,而属性的创造是动态的);其次,程序员很容易不知不觉地就创建了全局变量(比如打字出错);最后,顶层对象的属性是到处可以读写的,这非常不利于模块化编程。另一方面,window对象有实体含义,指的是浏览器的窗口对象,顶层对象是一个有实体含义的对象,也是不合适的。

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

var a = 1;
// 如果在 Node 的 REPL 环境,可以写成 global.a
// 或者采用通用方法,写成 this.a
window.a // 1

let b = 1;
window.b // undefined

上面代码中,全局变量avar命令声明,所以它是顶层对象的属性;全局变量blet命令声明,所以它不是顶层对象的属性,返回undefined

JavaScript 语言存在一个顶层对象,它提供全局环境(即全局作用域),所有代码都是在这个环境中运行。但是,顶层对象在各种实现里面是不统一的。

  • 浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window
  • 浏览器和 Web Worker 里面,self也指向顶层对象,但是 Node 没有self
  • Node 里面,顶层对象是global,但其他环境都不支持。

http://www.niftyadmin.cn/n/746741.html

相关文章

ES6学习笔记之2变量的解构赋(转载,备忘非我原创)

引用的原文地址ES6 入门教程 几个关键点: 变量的解构赋值对于 Set 结构,也可以使用数组的解构赋值。 let [x, y, z] new Set([a, b, c]); 默认值 解构赋值允许指定默认值。 let [foo true] []; foo // truelet [x, y b] [a]; // xa, yb let […

java多线程读书笔记2 Thread的各种简单属性和生命周期(浅谈)

以上内容均来自于本书和我的自己理解的总结 Java Threads, 3rd Edition [Book] (oreilly.com) Thread name The name of a thread is part of the information shown when a thread object is printed. Otherwise, it has no significance, so give your threads names that …

java多线程读书笔记3 介绍两种停掉线程的方法(停止线程的两种方法)

以上内容均来自于本书和我的自己理解的总结 Java Threads, 3rd Edition [Book] (oreilly.com) 第一种方法设置一个标识变量 1 Setting a Flag The most common way of stopping a thread is to set some internal flag to signal that the thread should stop. The thread ca…

java多线程读书笔记3 如何检测当前线程

以上内容均来自于本书和我的自己理解的总结 Java Threads, 3rd Edition [Book] (oreilly.com) Sometimes, you need to find out what the current thread is. You can retrieve a reference to the current thread by calling the currentThread() method (a static metho…

ES6学习笔记之3字符串处理(转载,备忘非我原创)

引用的原文地址ES6 入门教程 ES6 为字符串添加了遍历器接口(Iterator) 使得字符串可以被for...of循环遍历。 for (let codePoint of foo) {console.log(codePoint) } // "f" // "o" // "o" 知识点: JSON 本来就不允许…

java多线程读书笔记4 synchronized关键字

以上内容均来自于本书和我的自己理解的总结 Java Threads, 3rd Edition [Book] (oreilly.com) synchronized The Java specification provides certain mechanisms that deal specifically with this problem. The Java language provides the synchronized keyword; in comp…

java多线程读书笔记5 volatile关键字(转载)

以上内容均来自于本书和我的自己理解的总结 Java Threads, 3rd Edition [Book] (oreilly.com) Javas memory model is a bit more complex. Threads are allowed to hold the values of variables in local memory (e.g., in a machine register). In that case, when one thr…

ES6学习笔记之4数值表示法有关数值的扩展(8进制表示法)(转载,备忘非我原创)

引用的原文地址ES6 入门教程 二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。 0b111110111 503 // true 0o767 503 // true从 ES5 开始,在严格模式…