初学ES6(一) let和const

来源:互联网 发布:中科院自动化所 知乎 编辑:程序博客网 时间:2024/05/22 00:43

初学ES6

1. let,const声明变量

let,它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效

{  let a = 10;  var b = 1;}a // ReferenceError: a is not defined.b // 1

在for循环中使用let和var的区别

var a = [];for (var i = 0; i < 10; i++) {  a[i] = function () {    console.log(i);  };}a[6](); // 10

最后输出的是10。

var a = [];for (let i = 0; i < 10; i++) {  a[i] = function () {    console.log(i);  };}a[6](); // 6

上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
另外,for循环还有一个特别之处,就是循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。

let是不存在变量提升的

// var 的情况console.log(foo); // 输出undefinedvar foo = 2;// let 的情况console.log(bar); // 报错ReferenceErrorlet bar = 2;

暂时性死区

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

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

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

不允许重复声明

function func(arg) {  let arg; // 报错}function func(arg) {  {    let arg; // 不报错  }}// 报错function () {  let a = 10;  var a = 1;}// 报错function () {  let a = 10;  let a = 1;}

块级作用域

为什么需要块级作用域

  1. 第一种场景,内层变量可能会覆盖外层变量。
var tmp = new Date();    function f() {      console.log(tmp);      if (false) {        var tmp = 'hello world';      }    }    f(); // undefined

上面代码的原意是,if代码块的外部使用外层的tmp变量,内部使用内层的tmp变量。但是,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。

2.用来计数的循环变量泄露为全局变量。

var s = 'hello';var i = 10;for (var i = 0; i < s.length; i++) {  console.log(s[i]);}console.log(i); // 5

3.ES6的块级作用域
let实际上为 JavaScript 新增了块级作用域。

function f1() {  let n = 5;  if (true) {    let n = 10;  }  console.log(n); // 5}

ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。

const命令

const声明一个只读的常量。一旦声明,常量的值就不能改变。

0 0
原创粉丝点击