作用域:变量作用域(全局变量和局部变量) 、函数作用域(函数内部的变量)
作用域链:其实就是一些可访问对象的集合。比如函数执行时会产生一个活动对象,活动对象中。
在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
当一个函数创建后,它实际上保存一个作用域链,并且作用域链会被创建此函数的作用域中可访问的数据对象填充。
var:
1、可能存在声明提前
var声明、未初始化的变量会提升
未声明的变量赋值的变量会提升
只有var声明、初始化的变量不会提升
2、能重复声明、能重复赋值
3、不存在块作用域
let:
1、不存在声明提前,在块作用域的顶端会有暂时性死区。
2、不能重复声明、能重新赋值
3、存在块作用域
const:
同于let,区别在于const不能重复赋值。
var声明的变量需要注意的是,函数内部函数执行完成即可销毁,如果在window作用域下,则在关闭页面时才会销毁。
结语:那么何时使用let、const呢,如果只是引用,请使用let、const。循环中,优先使用let。