var、let和const的区别
-
变量提升
let和const定义的变量不存在变量提升,在定义之前使用,会报错ReferenceError
-
暂时性死区
let和const只在块级作用域中有效,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
if (true) { // TDZ开始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ结束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 } -
循环中i的定义
var result = new Array(); for (var i=0; i<10; i++) { result[i] = function() { return i; } } console.log(result[0]()) // 打印10之所以结果返回10,这是因为所有的i都使用同一个引用,而i最终会被更新为10,因此,result中所有函数都会返回10。
使用let解决变量污染:
var result = new Array(); for (let i=0; i<10; i++) { result[i] = function() { return i } } console.log(result[0]()) // 打印0在每次循环当中,都会创建一个新的let i(因为let只在块级作用域有效,因此是不会报错的),因此result[i]使用的每个i都是不同的,值并不会像使用var的例子那样不断增加。
-
其他
1、let和const不允许重复声明
2、let和const不会绑定全局作用域
let和const的区别
const是常量,不能被更改。