var let const

let 和 var

置信有许多前端工程师除了在声明函数时会用到 function 其他的变量声明一概运用 var, 不过跟着浏览器对es6逐步支撑我们应当学着运用 letconst 而不是运用存在诸多弊病的 var

var 存在着哪些弊病呢?

  • 没有块级作用域,很轻易声明全局变量
  • 变量提拔
  • 能够反复声明

典范的面试题

var arr = [];
for (var i = 0; i < 10; i++) {
    arr[i] = function () {
        console.log(i);
    }
}

arr[6](); // 希冀输出 6 现实输出 10
arr[7](); // 希冀输出 7 现实输出 10
arr[8](); // 希冀输出 8 现实输出 10

在ES6降生之前我们的解决方法基本是如许的

var arr = [];
for (var i = 0; i < 10; i++) {
    (function (i) {
        arr[i] = function () {
            console.log(i);
        }
    }(i))
}

arr[6](); // 6
arr[7](); // 7
arr[8](); // 8

ES6降生今后呢

let arr = [];
for (let i = 0; i < 10; i++) {
    arr[i] = function () {
        console.log(i);
    }
}

arr[6](); // 6
arr[7](); // 7
arr[8](); // 8

是否是简朴了许多, 这一切都要归功于let的块级作用域, 这里运用 var 声明的i是全局变量, 当for轮回实行完成今后, i的值已变成了10, 而在 console.log(i) 的时刻接见的同样是全局下的 i 因而我们会发明不管实行哪一个函数 i 的值都是10;
而运用 let 呢, 由于 let 声明的变量只在 let 敕令地点的代码块内有效, 所以每一次轮回的i实在都是一个新的变量, 而当实行 console.log(i) 时, js会沿着作用域链起首找到近来的 i 并输出, 因而会输出我们所希冀的 i 值.

除了存在块级作用域 相对于 var 不同之处另有

  • 不存在变量提拔
console.log(a); // undefined;
var a = 1;

console.log(b); // b is not defined
let b = 2;

这里用 var 声明变量时, 由于存在变量提拔, 在声明之前接见该变量会输出 undefined 并不会报错, 而运用 let 声明的变量在声明之前接见则会报错, 如许更相符人的通例逻辑.

  • 暂时性死区
var a = 123;

if (true) {
  a = 'abc'; // a is undefined;
  let a;
}

暂时性死区规定在声明之前就运用这些变量,就会报错。和没有变量提拔相似, 这些功用重要是为了削减顺序运行时的毛病, 使代码越发范例.

  • 不允许反复声明
let c = 2;
let c = 3; // Identifier 'c' has already been declared

同一个作用域内 不允许反复声明同一个变量。

  • 不会成为全局对象(window)的属性
var a = 3;
console.log(window.a); // 3
let b = 4;
console.log(window.b); // undefined;

const

除了 let 有时刻我们或许更须要 const

constlet 的唯一区分就是,const 不能够被变动,所以当声明变量的时刻,尤其是在声明轻易被变动的全局变量的时刻,只管运用 const

    原文作者:大白
    原文地址: https://segmentfault.com/a/1190000016042987
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞