super-fool / blog

珍藏经典, 分享思想, 共同进步.加油
3 stars 0 forks source link

基础(一): let/const #22

Open super-fool opened 5 years ago

super-fool commented 5 years ago

let/const与var的不同点:

  1. 具有块级作用域。
    {
    let a = 1;
    var b =2;
    }
    console.log(a); // a is not defined
    console.log(b); // 2
  2. 暂时性死区(temporal dead zone: TDZ), 这就是为什么不存在变量提升,该特性去除了变量提升特性。
    
    {
    console.log(a); // a is not defined
    console.log(b); // 2 
    let a = 1;
    var b = 2;
    }

function add(x=y, y=2){ return x+y; } add(); // y is not defined

上述问题:由于x参数的默认值为y,但是y还并没有声明,所以当add函数没有传入任何参数时会报错。

let a = 1; function test1 () { console.log(a); // 1 let b = 2; } function test2 () { console.log(a); // a is not defined let a= 2; } test1(); test2();


### const的不同点
1. const必须在声明时赋值,而var和let可以只声明而不需要同时赋值。
2. const 声明一个引用类型时,可以修改内部的值, 但是**不能修改当前的引用指针地址**

### 块级作用域的优点
1. 防止内层变量覆盖外层变量:

var nowTime = new Date(); function getNowTime () { console.log(nowTime); // 获取外层变量的当前时间 if (false) { var nowTime = ""; } } getNowTime(); // 打印出来的结果:undefined

如果将`nowTime`改为使用let就可以防止变量提升。
2. 防止用来计数的循环变量泄漏到全局,这是最常见的问题了:

var arr = [1,2,3]; var fn = []; for(var i = 1; i < arr.length; i++) { fn[i] = function() { console.log(i); } } fn[1](); // 3 fn[2](); // 3 console.log(i); // 3

super-fool commented 5 years ago

let\const 不属于全局变量

let a = 0;
console.log(window.a); //  undefined
super-fool commented 5 years ago

对于声明一些配置项(接口地址,依赖包,分页器的默认页数等常量)时,我们要使用const来声明。