js作用域,作用域链?
一、作用域
首先我们应该了解什么是作用域(scope),作用域就是我们代码执行的环境,作用域决定了代码块中变量和其他资源的可见性,
在es6之前,js只有全局作用域和函数作用域,后来才有了块级作用域,我们主要讨论es6出现之前的作用域;
二、全局作用域和函数作用域
全局作用域:整个JS执行环境,上下文环境
函数作用域:通过创建一个函数就开辟出了一个局部作用域
变量运行(搜索)机制:
首先看,有没有局部作用域
如果有,查找是不是这个局部作用域定义的变量
如果不是,寻找上一级作用域,直到找到全局作用域
如果全局作用域也找不到这个变量,这个变量就是未定义的 undefined
案例:
var scope="global"; function fun(){ console.log(scope); // undefined // 函数作用域 var scope="local" console.log(scope); // local } console.log('global'); // global // 全局作用域 fun();
三、块级作用域
块级作用域:块级作用域可通过新增命令 let 和 const 声明,所声明的变量在指定块的作用域外无法被访;
我们经常用到的就是块级作用域,
四、作用域链
1、自由变量:当前作用域没有定义的变量;
2、作用域链:就是寻找变量在作用域中的取值,如果当前作用于没有就会在向父级作用域查找,查找过程中形成的链条叫做作用域链;
var a = 100 function F1() { var b = 200 function F2() { var c = 300 console.log(a) // 自由变量,顺作用域链向父作用域找 console.log(b) // 自由变量,顺作用域链向父作用域找 console.log(c) // 本作用域的变量 } F2() } F1()