基本概念的使用
# 前言
在此之前我们已介绍过ES6的Class类,Promise,新增方法等。感兴趣的话可以查看专栏。接下来补一下ES6的基本概念的使用
和函数
。
# 变量
# let
概念: ES6新增声明变量的指令 let,它的用法类似与var,他是为了解决var在作用域方面出现的异常情况而新增使用词法作用域或块级作用域的变量
语法
let name = '小明'
let 与 var的区别
块级作用域变量获取,再循环中块级作用域会针对每一次迭代创建一个新的作用域
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i)
},1000)
}
/*
输出结果 5 5 5 5 5
var 的声明等价于,在循环的外部创建一个变量,循环内部计时器中的调用都是这这个全局变量
因为 js 先同步执行在异步执行,当setTimeout 被执行for循环已经结束了,
这时每个setTimeout引用都是全局变量i,所有打印都是5
var i = 0
for ( i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i)
},1000)
}
*/
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i)
},1000)
}
/* 输出结果 0 1 2 3 4
let 只在自身的作用域内有效
上面的for循环 其实等价于每次循环都在循环内创建了一个新的let i(i只属于代码块的内部)
内部setTimeout引入其对应作用域的i值 输出的值就是 0 1 2 3 4
for(var j = 0;j < 5; j++) {
let i = j
setTimeout(function() {
console.log(i)
},1000)
}
*/
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
提示
块级作用域,拥有块级作用域的变量只能在当前当前代码块
中使用。不能在外部访问。块级作用域还有一个特点他们不能
在被声明之前读写,直到声明let变量的代码之前的区域都被成为暂时性死区
console.log(age) // 正确, var 允许变量提前
var age = "小明"
console.log(name) // 错误, let 不允许变量提前
let name = "小明"
2
3
4
5
6
7
重复声明,块级作用域变量不允许
在同一个作用域下被重复声明
let name = "小明"
let name = "小华" // 错误,同一个作用域下let变量不可以重复声明
var name = "小刚" // 错误,同一个作用域下let变量也不可以使用var重复声明
2
3
# const
概念:const是声明变量的另一种方式,它与let相似。但是const声明的变量被赋值后不能再改变。(我们可以理解为他是一个常量),并且const声明的变量必须在声明时赋值。
const name = "小明"
name = "小华" // 错误,const只允许赋值一次
console.log(name)
const age; // 错误 const必须在初始化时赋值
2
3
4
5
注意
基本数据类型存放在栈中,引用数据类型存放在堆中
栈中的数据大小已知
栈中的数据由系统自动开辟自动释放
栈的赋值都是深拷贝(创建了新的内存空间)
堆中的数据大小未知
堆中的数据由开发人员手动开辟手动释放
堆的赋值都是浅拷贝(引用同一段内存地址)
const person = {
name: 18,
age: 19
}
person.name = 1 // 正确,修改引用数据类型属性不会报错
console.log(person)
2
3
4
5
6
7
8
因为引用数据类型声明的const 变量只是一段地址值,内部属性发生变化不会影响地址。所以即使是const声明的对象、数组依然可以修改他们的属性方法。本质上来说const并不能保证其值是不能改变,只能保证变量指向的那个内存地址不能改动。
# 顶层对象属性
全局变量指一般与window对象的属性(顶层对象属性)挂钩。ES6中使用let const可以声明作用在全局的变量。但是这些变量不是顶层对象的属性
const person = {
name: 18,
age: 19
}
console.log(window.person) // undefinded
var a = 6
console.log(window.a) // 6
2
3
4
5
6
7
8
9
10
# ES2020 globalThis
概念:不同js环境下的全局属性 globalThis
包含全局的 this 值,类似于全局对象(global object)。
function canMakeHTTPRequest() {
return typeof globalThis.XMLHttpRequest === 'function';
}
console.log(canMakeHTTPRequest());
// expected output (in a browser): true
2
3
4
5
6
在以前,从不同的 JavaScript 环境中获取全局对象需要不同的语句。在 Web 中,可以通过
window
、self
或者frames
取到全局对象,但是在 Web Workers 中,只有self
可以。在 Node.js 中,它们都无法获取,必须使用global
。在松散模式下,可以在函数中返回
this
来获取全局对象,但是在严格模式和模块环境下,this
会返回undefined
。 You can also useFunction('return this')()
, but environments that disableeval()
, like CSP in browsers, prevent use ofFunction
in this way.globalThis
提供了一个标准的方式来获取不同环境下的全局this
对象(也就是全局对象自身)。不像window
或者self
这些属性,它确保可以在有无窗口的各种环境下正常工作。所以,你可以安心的使用globalThis
,不必担心它的运行环境。为便于记忆,你只需要记住,全局作用域中的this
就是globalThis
。