ES6-let

作者: 东邪_黄药师 | 来源:发表于2018-10-31 10:57 被阅读1次

let命令:
基本用法
ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
if:::::

{
    var a = 100;
    let b = 200;
}
console.log(a); //100
console.log(b); //b is not defined -- Error

不存在变量提升
let不像var那样,会发生“变量提升”现象。

  //ES5
console.log("ES5:");
var a = [];
for (var i = 0; i < 10; i++) {
    var c = i;
    a[i] = function () {
        console.log(c);
    };
};
a[5](); //9

//ES6
console.log("ES6:");
var b = [];
for (var j = 0; j < 10; j++) {
    let d = j;
    b[j] = function () {
        console.log(d);
    };
};
b[5](); //5

暂时性死区

  {
    console.log(a); //undefined
    let a = 100;
    console.log(a); //100
}

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

var a = 100;
{
    console.log(a); //undefined
    let a = 100;
    console.log(a); //100
}

不允许重复声明
let不允许在相同作用域内,重复声明同一个变量

 // 模块之间不影响,可以重复声明
{
    var a = 100;
    var a = 200;
    console.log(a);  //200
}
{
    let a = 300;
    console.log(a); //300
}
// 模块内部不允许用let命令重复声明
{
    var a = 1;
    let a = 2;   //输出后会报错
}

===========================================================
为什么需要块级作用域?
ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
第一种场景,内层变量可能会覆盖外层变量。

var time = new Date();

function fun() {
    console.log(time);
    if (false) {
        var time = "Hello World!";
    };
};
  //time="hello world" 把外部的new Date 覆盖了
fun();  //undefined

第二种场景,用来计数的循环变量泄露为全局变量。

var string = "Hello World!";

for (var i = 0; i < string.length; i++) {
    console.log(string[i]);
};

console.log("循环结束");

     //i跳出的循环体,没有被完全释放出来。
console.log(i); //12

=========================================================

 <script type="text/javascript">
console.log("ES5:");

function fun() {
    var num = 100;
    if (true) {
        var num = 200;
    };
    console.log(num);
};

     fun(); //200
  </script>

  <script type="text/traceur">
console.log("ES6:");

function fun() {
    let num = 100;
    if (true) {
        let num = 200;
    };
    console.log(num);   //num没有受到let num =200的影响
};

fun();  //100

</script>

案例二:

   <script type="text/traceur">
console.log("ES6:");
function fun() {
    console.log("I am outside!");
};

(function () {
    if (false) {
        function fun() {
            console.log("I am inside!");
        };
    };

    fun();
}());  //I am outside!
  </script>

===========================================================

相关文章

  • ES6-let

    let命令:基本用法ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所...

  • ES6-let

    ES6是js语言的国际标准,js是ES6的实现。 检测浏览器对的ES6的支持程度 tracecur转码器将es6翻...

  • 复习

    复习 函数作用域 全局作用域 局部作用域 块级作用域(es6-let,const) 优先级局部变量(函数体内声明的...

  • html5+es6

    复习 函数作用域 全局作用域 局部作用域 块级作用域(es6-let,const) 优先级局部变量(函数体内声明的...

  • ES6-let & const

    一. let与var let 是块级作用域;var 是函数级作用域。 二. let 与 const let与con...

  • ES6-let const

    let特性1.不能重复申明2.块级作用域 全局 函数 eval3.不存在变量提生4.不影响作用域链 const声明...

  • es6-let与const

    作用域的概念 es5 两个作用域:全局作用域、函数作用域 es6 增加了块作用域 let let var 作用域不...

  • ES6-let 与 const

    1.let命令 基本概念 let语法类似于var,不同点在于let定义的变量只在定义它的代码块中有效。 {var ...

  • es6-let和const

    1:let 基本语法 let 声明的变量,只在let命令所在的代码块内有效 for循环设置循环变量的那部分是一个父...

  • ES6-let会不会提升

    https://fangyinghang.com/let-in-js/ 在es5里面,var会提升,但是let会创...

网友评论

      本文标题:ES6-let

      本文链接:https://www.haomeiwen.com/subject/hagntqtx.html