ECMAScript6.0学习之第一篇--let学习

来源:互联网 发布:语音随机聊天软件 编辑:程序博客网 时间:2024/06/17 11:51

本文是在看完阮一峰老师的著作只会所总结的~~~~

给阮老师致敬,同时也可以去阮老师的的书里看 ~~ http://es6.ruanyifeng.com/#docs/let

另外若要看如何使用搭配es6环境,请看我的上一条博客

ECMAScript6.0是下一代的js语言标准,于2015.6发布。

let是ES6新增的用法,用来声明变量的,用法类似于var。但其又有独特的作用。

一:看看let和var的差别

说明:下面所敲得代码都在严格模式下,前面添加“use strict”

1.变量声明:

{
    let a=10;
    var b=1;
}
console.log(a); //会报错 ReferenceError: a is not defined  因为a只在前面的代码块中有效。
console.log(b);//1
输入a会出现错误,而b则输出正确结果。因为let命令是在块级作用域有效,所谓块级作用域就是{}括起来的。

2.for循环:

 

var a=[];

for(var i=0;i<10;i++){

   a[i]=function(){

       console.log(i);

    }

}

a[6]();  //10 因为用var声明的i,所以在全局范围内都是有效的,所以每一次循环都会导致i++,最后输出最后一轮i的值

//如果换成let声明,则只会输出6。因为当前的i只会在本次循环有效,不叠加到下次循环里面,所以每一次输出的i都是一个新的变量。

再举一个例子:

for(let i=0;i<10;i++){

   console.log(i);//输出0~9

}

这里输出0~9的数字而不会直接输出9,是因为let只在本次循环有效,所以循环一次就会输出一个值。

3.变量提升:

let在同一作用域内不存在变量的提升。也就是使用前先声明。

if(true){

   console.log(tmp);  //ReferenceError: tmp is not defined

    let tmp;

   console.log(tmp); //undifined

}

有可能你测试的结果会有点不一样,那是因为采用了babel转码,babel会先将let转为var再使用。而var是有变量提升的。

如果你在cmd或者其他地方运行,基于node xx.js 和babel-node xx.js将会得到不同的结果。

本文所有代码都没有进行转码,只在Node环境下运行。

4.同一作用域不允许重复的声明一个变量:

if(true){

   console.log(tmp);

    let tmp;

    lettmp="123";

   console.log(tmp);

}

//会报错 Duplicatedeclaration "tmp"  同一作用域中不能用let声明相同的变量。而我们的var是可以重复声明的,只是后面的值将覆盖前面的值。


5.暂时性死区:

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

 具体案例:

var tmp=123;

if(true){

    tmp='abc';

    let tmp;

    console.log(tmp);//ReferenceError: tmp is not defined

}

//var定义了一个tmp,所以存在一全局变量tmp,但是如果块级作用域内又用let声明了一遍tmp,导致后者绑定了这个块级作用域,而且在变量声明之前就使用了tmp,所以导致输出的结果为ReferenceError: tmp is not defined ,如果将let tmp移动到tmp='abc'上去,则会输出abc。


二:关于块级作用域:

  1.保证每一个变量都有其单独的值,不用担心被覆盖。

  2.不用担心内部的变量会泄露成全局变量。

 3.内层作用域可以定义外层作用域的同名变量。如果一个变量嵌套了多个块级作用域,外面的作用域是无法读取内部的作用域的。也就是不同的作用域变量是互不相关的。

例如  {{{{
       let a = 'a';
      {let a= 'b'}
      }}}};

可以得出几点结论:块级作用域是可以任意嵌套{}的。

                          内部的{}可以定义和外部的{}同样的变量名。

                          { let a='a'}括号内是只能调用本括号内的值,无法读取到内部的值,所以其结果只能输出a。

                          而内部变量是可以调用外部变量的值, { let a = 'a';{console.log(a)}},是可以输出a。

  4.ES6里面不需要匿名函数,而直接{}就可以执行。        

(function () {  var tmp = ...;  ...}());// 块级作用域写法{  let tmp = ...;  ...}
  三:关于块级作用域的函数声明:

   允许在块级作用域内声明函数。函数声明类似于var,即会提升到全局作用域或函数作用域的头部。同时,函数声明还会提升到所在的块级作用域的头部。

    函数声明的用法和Let也有点相似,外层函数不能调用里层块级作用域的函数。

  并且所有的声明只能在有大括号{}的时候成立,没有将会出错。





 











0 0