自学es6中let、const总结篇

今天没有任务了,leader看了我的编码风格,给我的建议就是多实践,夯实基础,所以列了一些内容让我来看。首先我又看了let,const的内容,这次又有了很多新的感悟。

let与const都是es6中新出现的语法内容,首先我来回答以下几个问题

1.为什么会提出let和const,他们解决了什么问题?

在es6之前,es5中的作用域只有全局作用域和函数作用域,而声明变量只能是var,而使用var声明的变量会有一些问题,第一个问题就是导致用于计数的循环变量全局化,即泄露为全局变量。如下代码:

var s='hello'

for(var i=0;i<9;I++){

   console.log(s[i])

}

console.log(i)//8

以上代码其实我们希望循环指针i用完之后,系统自动回收,但是最后的结果却是for里的计数变量i在全局生效。

第二个问题是内层变量覆盖外层变量,如下代码

var tmp = new Date()

function f(){

   console.log(tmp)

   if(false){

      var tmp = 123

}

}

f();//undefined

该代码的原意是if外层的代码使用外层的tmp而If内层的代码块使用内部的tmp,但是由于变量提升,内部的变量覆盖了外层的变量。

其实使用let就可以解决以上问题。

使用let定义的变量不存在变量提升,而且使用let定义的变量不允许在作用域内重复定义,否则会报错,let定义的变量存在暂时性死区,即只要在有let定义的变量的作用域内,该变量就绑定该作用域,不受外部影响。

二、const

const定义的时一个常量即:

const  i=1;

i=2;//就会报错

const定义的是常量,该常量的值是不能改变的。在javascrip中,使用const定义的基础类型的常量,该常量指向的地址中的值是不变的。使用const定义的复杂类型的常量,该常量里存储的是一个地址,则表明该地址是不可变的,但是const定义的复杂类型变量里的数据结构是否可变,那就不能保证了,例如:

const f = {};

f.name = 'yn'

f={}//报错

注意:const定义的常量必须初始化,不然会报错。

你可能感兴趣的:(es6)