ES6

let 和 const

2021-06-07  本文已影响0人  你好岁月神偷

let 和 const 声明的变量不作为 window 的属性, 只是一个块级作用域(Script)中。

例子:

let  num = 1;   

const num1 = 1;   

function fn() {

    conosle.log(this.num); //  undefined

    console.log(this.num1); // undefined

}

fn()

那如何获取全局作用域下声明的变量呢?(let 和 const 是JS中的块级作用域)

在定义变量的块级作用域中就能获取啊,既然不属于顶层对象Window,那就不加 window(global),直接访问即可。

let  num2 = 2;    console.log('num2:', num2)  // 2

const num3 = 3;    console.log('num3:', num3)  // 3

1、不存在变量提升

       let 和 conts 声明变量,一定在声明后使用,否则报错。

// var 的情况 (var 会存在变量提升,① var foo; 声明提前,② console.log(foo)  ③ foo = 2;赋值留在原地)

console.log(foo); // 输出undefined 

var foo = 2; 

// let 的情况 

console.log(bar); // 报错ReferenceError 

let bar = 2;

2、暂时性死区

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

var tmp = 123;if (true) { tmp = 'abc'; // ReferenceError let tmp;}

代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

3、不允许变量重复声明

ES5  使用 var  对变量进行声明,可以对同一个变量名进行重复来写。

例子: var name = '张三'; var name = '李四';   console.log(name) // = 》'李四'

这样来写的话,不会报错,只要不断对同一个变量名进行声明和赋值的操作,这个变量的值等于最后一次书写的值。

ES6 使用 let 和 const   是不允许对同一个变量进行重复声明侧。(重复声明同一个变量,代码执行时,报异常)

let 声明的变量可以不用马上赋值;

const 声明的变量,一般是声明常量,且必须给变量赋值,且不允许修改变量值(对象除外。这里涉及到数据类型:基础数据类型(number、string、boolean、null、undefined、symbol)值存在栈中、引用数据类型(object、array、function)引用存储在栈中,真实具体的值是存储在堆中的。不修改引用,修改对中具体的值时,代码不会报错)

4、块级作用域

        ES5 中作用域有:全局作用域、函数作用域。没有块作用域的概念。

        ES6 中新增了块级作用域。块级作用域是由 { } 包括, if 语句和for语句里面的 { } 也属于块级作用域。

var、let 和 const 异同点:

1) var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。

2)let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。

3)const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改

但是有个例外:对象是引用类型:只要在栈中存对象的引用,堆存值,只要不修改栈中的引用,那就没有问题)。

4) 在全局作用域下,var 声明的变量,是作为window 属性存在的;而 let、 const 声明的变量不会作为 window 的属性存在。

上一篇 下一篇

猜你喜欢

热点阅读