作用域
作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
作用域链
函数对象有一个内部属性[[Scope]],包含了函数被创建后的作用域中对象的集合,
这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
示例:
当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。
作用域就是变量和函数的可访问范围,通常,局部环境中的变量和函数是不能被外部环境访问的;
作用域链决定了哪些数据能够被当前函数访问以及访问的顺序;
函数创建时,会创建一个Global Object,填入它的作用域链;函数执行时,会创建一个运行期上下文的对象,它定义了函数执行时的环境。函数执行环境包含一个活动对象,该对象包含了函数的所有局部变量、命名参数、参数集合以及this,它会被推入作用域链的最前端;
函数执行过程,每遇到一个变量,都会经历一次标识符解析的过程(逐级向上搜索作用域链)以决定从哪里获取和存储数据;
全局变量存在于运行期上下文作用域链的最末端,查找最慢,所以我们应该尽可能少使用全局变量,如果使用,就先用局部变量缓存下来;
在运行期上下文运行的过程中,其作用域链只会被 with 语句和 catch 语句影响,应少用with,把catch中的错误委托给一个函数处理;
js中没有块级作用域,但是我们可以模仿实现它。
参考链接