var会污染全局变量
如果var在if里面定义在if外面也能够访问到。
若是想实现某些需求,var会变得十分繁琐。
例如:
点击每一列,输出每列的索引值。
若是用var来做
只会使点击的每一列都是3,因为var所定义的i已经变成了一个全局变量,for循环一瞬间执行完成了,var i 的值只会使最后一个的值,若是想达成需求,只能给oli每个节点,分配一个index,来实现。
let不会污染全局变量
let使变量限制在这块之内,外面访问不到if块里的变量。
若是想实现某些需求,let比之var会轻松很多。
例如:
点击每一列,输出每列的索引值。
用let来做
用let,就不用分配index了,因为在每一个块级作用域,i都是新定义的,不会变量提升到全局。
每一轮for循环的i都是一个新的值。i的变量只在for循环的作用域有效,不会影响其他地方。
var允许重复声明
let不允许重复声明
var会变量提升
let会变量提升,但不等同于var的变量提升
let会变量提升,let还有暂存性死区
报错的意思就是,初始化前不能访问。let所定义的变量的声明会被提升到顶部,但变量的初始化,依然会在原来的位置出现,如果你想在变量初始化之前访问变量,将会得到一个ReferenceError。
在这个时间段,变量已经被创建,但还未完成初始化,因此处于死亡状态,称之为暂存性死区。
var会与顶层对象挂钩
var关键字声明的变量会成为全局变量,并附加到全局对象window身上。
let不会与顶层对象挂钩
它有助于减少由于意外创建全局变量所导致的bug