let 和 var
置信有许多前端工程师除了在声明函数时会用到 function
其他的变量声明一概运用 var
, 不过跟着浏览器对es6逐步支撑我们应当学着运用 let
和 const
而不是运用存在诸多弊病的 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
const
和 let
的唯一区分就是,const
不能够被变动,所以当声明变量的时刻,尤其是在声明轻易被变动的全局变量的时刻,只管运用 const
。