您的位置:首页 > 其它

ES6 let命令

2020-02-03 04:50 302 查看

我们都知道JavaScript分三部分组成,分别是:ECMAScript(核心)、DOM(文档对象模型)、BOM(浏览器对象模型)。后面我们就说说关于ECMAScript的知识。

有时候我们会在一些招聘简章上写着那样的一些要求——熟悉ES6。

那什么是ES6?

ES6是ECMAScript 6.0的简称,它是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

ES6新增指令——let

1.块级作用域

我们知道JavaScript是没有块级作用域这个概念的,而let指令的出现恰好弥补了这一点。

块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。

let块级作用域的体现

//案例一

{
 var a=56;
 let b=30;
 }
 console.log(a);//56
 console.log(b);//报错

 

//案例2

//var 情况
 var a=[];
 for(var i=0;i<10;i++){
 a[i]=function(){
 console.log(i);//10
 };
 }
 a[6]();      //函数调用 ,a[6]=function(){console.log(i)};根据作用域链向上寻找,找到全局变量i
 

//let情况

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

从案例一我们知道 var声明的变量由于不存在块级作用域所以可以在全局环境中调用,而let声明的变量由于存在块级作用域所以不能在全局环境中调用。

案例二粗浅理解,若有误请大佬指点

在var 情况 ,var 声明的变量,全局范围内有效,每次循环i发生改变,重新赋给函数内部的console.log(i);直到循环结束,输出结果10

在let情况,

从闭包方向去理解。循环过程如下。
 第一次:
 {
 let i=0;//let使for循环为块级作用域
 b[0]=function(){
 console.log(i)
 };      //注意:由于循环时,let声明i,所以整个块是块级作用域,那么a[0]这个函数就成了一个闭包
 }//闭包b[0]
第二次:
 {
 let i=1; //注意:因为let i=1; 和 上面的let i=0;出在不同的作用域中,所以两者不会相互影响。不覆盖
 b[1]=function(){
 console.log(i)
 };
 }
 依次循环,直到i=10不满足不执行;
 a[6]();//调用a[6]()函数,这时执行环境随即进入下面这个代码块中的执行环境:funcion(){console.log(i)};输出结果为6;

//案例3
//解析:for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
for(let h=0;h<3;h++){
let h='abc';
console.log(h);
}

输出结果:

 

//案例3
for(var h=0;h<3;h++){
console.log(a);
var a='abc';
console.log(h);
}

 输出结果:

 

2不存在变量提升

我们在预解析的学习过程中知道,var命令会发生“变量提升”现象,即var定义变量先使用后声明,值为undefined。而let定义变量:只可先声明,后使用。

//var 的情况
console.log(foo);//underfined
var foo=2;

//   let 的情况
console.log(bar);//报错
let bar=2;

3 暂时性死区

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

 

if(true){
tmp='abc';
console.log(tmp);//报错 
// 在let命令声明变量tmp前,都属于死区
//
在代码块内,使用[code]let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。 let tmp; console.log(tmp);//undefined tmp=123; console.log(tmp);//123 }[/code]

注:上面代码中,存在全局变量

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

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

4.不允许重复声明

function func (){
let b=100;
var b=10;
}

function add(num){
let num;
return num+1;
}

function another(){
let a=10;
let a=5;
}

以上几种均为报错。

注意:第二个函数,虽然我们没有明确的声明,但是参数实际上是相当于用var声明的局部变量。

 

转载于:https://www.cnblogs.com/smile-xin/p/11399345.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
baiyong1930 发布了0 篇原创文章 · 获赞 1 · 访问量 160 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: