ES6-let与const

ES6在ES5的基础上增加了许多新功能和新用法,可以简化代码。

但是目前只有一些高版本的浏览器才支持es6, 因此需要利用babel对es6进行转码。

let命令和const命令

let命令特点:不存在变量提升、暂时性死区(先声明后使用,否则报错)、不允许重复声明;

let命令和var很类似,也是用来声明变量的,但是所声明的变量,只有在let命令所在的代码块内才有效,这也是es6最大的特点之一:增加了块级作用域。(es6之前:函数作用域和全局作用域)

块级作用域:只在当前代码段之间有效;其存在解决了闭包问题,在for循环里面声明i的时候用let命令就可以了。

//立即执行函数解决闭包问题
  var arr = [];
  for (var i = 0;i < 10; i ++){
      (function(j){
          arr[j]=function(){
    	        console.log(j) //3
    	  }
      })(i)
 }
 arr[3]();
//利用let声明,块级作用域解决闭包
  for (let i = 10; i < 20; i++){
      arr[i] = function(){
          console.log(i) //13
      }
  }
  arr[13]();

let不存在变量提升的问题,不会像var那样将变量提升到作用域的顶部,let声明的变量一定要在let声明之后使用,否则会报错。

暂时性死区:在let命令声明变量之前,该变量都是不可用的。只要会计作用域之内存在let,它所声明的变量就绑定到了这个区域之内,不受外部影响。

暂时性死区的本质就是:只要进入当前作用域,所要使用的变量就已经存在了,但是不可以获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

es6中的暂时性死区和无变量提升,主要是为了减少运行时的错误,防止在变量声明之前就使用这个变量,从而导致意料之外的错误。

不允许重复声明:在同一个作用域之内,let和const都不允许重复声明同一个变量,包括变量和形参的名字相同的情况。


const命令

声明只读常量,声明的值不可改变。

eg: const PI = 3.14这样的常量。

const声明的变量不能被修改,因此只能在声明的同时就赋值,不能先声明后赋值。

不过const对于一个引用值来说有点特殊,const只是保证变量指向的地址不变,当我们const声明一个对象或者数组的时候:

const obj = {};

obj.name = ‘Mandy’;

不能改变obj的指向,但可以对obj的属性进行增删改查的操作。


顶层对象的属性

顶层对象指window这一级别的对象。

在es5中,在全局环境声明一个变量,相当于把这个变量挂载到了window对象上面:

var a = 1 <=> window.a = 1;

这就导致了编程人员在写的时候经常会不知不觉地创建了全局变量,这样很不利于模块化开发。

在es6中,var和function 命令声明的全局变量,依然是window的属性,但是let、const、class声明的全局变量,不再是window的属性了。


猜你喜欢

转载自blog.csdn.net/mandyucan/article/details/80232352