2018-04-11
2018-04-11 本文已影响0人
小明阿李
JavaScript作用域链浅析
1、作用域
作用域指的是变量存在的范围。在ES5规范中,JavaScript只有两种作用域:
- 全局作用域,变量在整个程序中始终存在,所有地方均可读取;
- 函数作用域,变量只在函数内部存在。
函数外部声明的变量就是“全局变量”,可以在函数内部读取;

在函数内部定义的变量称为“局部变量”,外部不能读取。

函数内部的局部变量会覆盖同名全局变量。

2、作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。
我们来看下面这段代码:
var a = 2
function fn1(){
console.log(a);
}
fn1();

当某个函数第一次被调用时,就会创建一个执行环境(execution context)以及相应的作用域链。当调用fn1()时的作用域链如下:
- 函数在执行的过程中,先从自己内部找变量
- 如果找不到,再从创建当前函数所在的作用域去找, 以此往上
可以看到fn1内没有变量a,于是沿着作用域链向后寻找,最后找到全局变量a,所以返回了全局变量a的值。
标识符解析是沿着作用域链一级一级地搜索标识符地过程。搜索过程始终从作用域链地前端开始,然后逐级向后回溯,直到找到标识符为止(如果找不到标识符,通常会导致错误发生)—-《JavaScript高级程序设计》
本文仅为自已当前学习的简单理解,如需深入了解请参考其它文章。
参考:
http://javascript.ruanyifeng.com/grammar/function.html#toc11
https://blog.csdn.net/whd526/article/details/70990994