前言:首先说下作用域,两种:全局作用域、函数作用域。es6时多了一个作用域:块级作用域。一起来看下吧~
1、全局作用域:
var a = 1 //声明一个a
window.a // 1
function test(){
console.log(a)
}
test() // 1
console.log(a) // 1
这就是全局作用域,只要声明了,全局的任何地方都可以拿到,所以就叫全局作用域。
2、函数作用域
函数作用域包括:定义在函数内的变量,只作用于函数内部,也就是说别的地方拿不到。(重点,跟闭包有很大关系,先不讲闭包)
函数作用域:
function test(){
var bb =11
}
console.log(bb) //报错 bb is not defined
验证完成,上面函数内用var声明的变量,在函数外面直接拿不到了,说明声明的变量只作用在函数内。
3、es6的块级作用域{} + let/const:
我们先看下es6之前:
if(true){
var aaa = 123
}
console.log(aaa) // 123
{
var b = 2
}
console.log(b) // 2
可以看到上面的es6之前通过var声明的变量,有明显的弊端啊!
举个栗子:我的英文实力水平有限,在许多块级元素声明变量时候可能会导致重复,要知道,var声明的东西可以再次声明的并且改变原本数据类型的,那就会把我原先的变量给覆盖了。
有因必有果,为了有更好更清晰的定义于是**es6的块级作用域const、let应运而生。
块级作用域
很好理解,用{ }包裹的就属于就属于块级作用域,例如if、switch、for语句中,使用const、let声明变量就属于块级作用域。
if(true){
const test = 1234
}
console.log(test) // test is not defined
if(true){
let test2 = 1234
}
console.log(test2) // test2 is not defined
区别
const声明的是一个常量
let声明的是一个变量 (变量就是数据类型可变的)
let a = 1
a = {}
a // {}
const b = 1
b = {} // 报错
以上内容为个人理解,可能不够标准表述,但是方便理解与记忆,错误之处留言指出~~~😊
温馨提示:看完此文可以和闭包一起食用