首先,关于作用域和闭包是一个很深的问题,困扰着很多初学者,包括我在内,也在初学阶段困扰不堪,此文依据《JavaScript权威指南(第六版)》进行对作用域的浅谈,分上下两部分,上部分主要说变量优先级和变量提升以及声明提前,下部分说作用域链和闭包问题。提前说明,本文面向初学者,且不涉及es6新特性,这也是个人建议,先把es5基础打好,再慢慢的去进阶。废话不多说,正文开始。
变量作用域
一个变量的作用域是指这个变量能被调用和使用的区域,在函数内声明的变量是局部变量,作用域在函数内部,函数参数也是局部变量。全局变量则是在所有函数外被声明的变量。
函数内变量优先级
函数内的变量优先级高于全局变量,如果在函数内声明的局部变量和全局变量重名,那么在函数局部范围内,局部变量的赋值和计算将顶替全局变量原有的值,但是在函数之外继续引用全局变量,全局变量原来的值不变。