var let const 的区别
var 是局部变量或者全局变量,在执行时会提升层级
let 是块级变量,只有在定义时才能进行访问
const为严格变量,在定时时且声明,只能进行访问
如果用for循环里定义一个var ,因为var 执行会提升层级,所有var 永远指最后一个对象。
关键点是:1.理解作用域链。
2.var和let的作用域。
3.变量提升。
详细讲解一下:
铺垫知识:
1.var声明变量是函数作用域,而let声明变量是语句块作用域;
2.var提升到函数定义顶部,此处是全局作用域顶部;let提升到语句块顶部,此处是for循环第一行。
3.for( let i = 0; i< 5; i++) 这句话的圆括号之间,有一个隐藏的作用域(用var时没有)。
for( let i = 0; i< 5; i++) { 循环体 } 在每次执行循环体之前,JS 引擎会把 i 在循环体的上下文中重新声明及初始化一次。
正式讲解:
1.i的声明被提升。
2.当运行for循环时为i赋值,并为每个li绑定事件(注意:运行for循环时只是绑定了事件但是并没有执行事件)。
3.当触发事件时(注意:此时for循环执行完了),现在需要控制台打印i的值,于是i便沿着作用域链寻找它的值。
4.当用var声明时,i会在全局作用域中找到它的值,为5.
5.当用let声明时,i会在for的第一行找到它的值,每次的值不一样,分别为0、1、2、3、4.