开始的时候需要将编辑器调整成ES6的模式
webstorm的设置方式如下:
点击FILE下的Settings,然后选择Languages&Frameworks里的JavaScript
然后下拉框勾选ECMAScript 6 接着下面两个单选框也勾上

下面就是let和const 两者的介绍

一:用let 和 const 声明变量和常量   ES5之前是用 var 
1:作用域只局限于当前代码块
代码块:一般来说被大括号包裹的就是一个代码块
{
var str = '张山';
console.log(str);  //1

let  str1 = '李四';
console.log(str1); //2
}
console.log(str);  //3
console.log(str1);  //4
12 两处输出都是正常的 ,然后出了大括号包裹范围后,3能够正常输出,
而4却不能,会报 str1 is not defined 的错误

由以上现象就可以看出,let 声明的变量存在作用域限制

2:使用let声明的变量作用域不会被提升
先来看一段代码块
{
console.log(str);
var  str = '张三';
}
这一段输出是什么? 运行后发现输出是undifined (没有报错)
然后,如果换成let来声明变量的话,这段代码的输出又是什么?
结果是报错, str is not defined  
这里要区别报错和没报错下的undefined。比如说,如果用var 来声明的话,他没有报错,
当有下面一段代码的时候:
{
if(typeof(str) == 'undefined'){
            console.log(11);
}
console.log(str);
var  str = '张三';
}
是可以正常输出 11  和  undefined 的
然而换成let 的时候确实只会报错 str is not defined

3:在相同的作用域下不能声明相同的变量名
{
var str = '李四';
var str = '张山';
console.log(str);
}
输出结果是 张山. 在es5中,重复声明同一个变量是没关系的,规则是后一个变量把前一个覆盖。
然而换成let的话,就会报错: str has already  been declared  也不会做任何执行效果

4for 循环体现let父子作用域
在页面中创建五个按钮:
然后写上如下js代码:
{
    var btn = document.querySelectorAll('button');
    for(var i = 0;i<btn.length;i++){
        btn[i].onclick = function () {
            alert('点击第'+i+'按钮');
        }
    }
}
然后在页面中点击任意一个,发现弹框显示都是 点击第5个按钮 信息
原因就是:for循环是同步的运行代码,而.onclick方法是异步的,所以在for循环运行结束后异步代码才开始找到i的值(5)。
这种现象有很多种解决办法:(闭包)和 (es6的let作用域限制)
闭包如下:
{
    var btn = document.querySelectorAll('button');
    for(var i = 0;i<btn.length;i++){
(function(i){
   btn[i].onclick = function () {
               alert('点击第'+i+'按钮');
            }
})(i)
    }
}

es6的作用域限制如下:
{
    var btn = document.querySelectorAll('button');
    for(let i = 0;i<btn.length;i++){  //1
        btn[i].onclick = function () {   //2
            alert('点击第'+i+'按钮'); //3
        }
    }
} //直接将i的声明改为let就可以了
这个原因就是父子作用域的限制。3中的i的取值作用域是2中的i,而2中的i的取值作用域是
1中的i,那么就限制了3中的i的作用域范围,使他只能在for循环中查找i值

 

posted on 2018-02-06 21:19  YKing_匆  阅读(179)  评论(0)    收藏  举报