MDN的解释是:
当前的执行上下文。
一.前言
首先作用域的英文就是scopes,在js中是函数的一个私有属性【【scopes】】,这个私有属性就储存着所有的上下文,对应的就是全局对象Global Obeject---全局上下文和局部对象 Active Object---局部上下文。
一个函数在定义时,Scopes属性中已经储存了GO
一个函数在运行时 Scopes属性中会逐一添加AO
函数在每次运行时,都会产生一个独一无二的AO,当函数执行完后,它所产生的AO对象会被销毁,当然闭包又是另一个情况,这个我后面会详细说明
二.全局作用域
在上一篇中在js预解析过程,分析过如何产生一个上下文--全局对象GO的过程,这里不再赘述,详情请看【面试题-描述一下JS预编译过程?】超级详解_悠悠-wzr的博客-CSDN博客
三.函数作用域之闭包
闭包:
一个作用域可以访问到另一个作用域中的变量,并且作用域链不释放的现象
-
闭包中的闭是指的局部变量的私有性,包指的是储存的这个局部变量
-
function father() { var time = 1; return function son() { time++; return time; } } var temp = father()(); console.log(temp)
上述例子就是,temp作为一个新的函数,访问到了另一个函数的变量time,
-
原理
temp牵住了son,son牵住了father,使得,father函数执行完之后作用域不能立刻销毁。
四.作用域链
官方解释:[[scopes]]中所存储的执行器上下文(上下作用域)对象的集合,这个集合呈链式链接,我们把这种链式叫做作用域链
函数在执行过程中会产生作用域,一个嵌套函数(套娃)在寻找变量的时候,会沿着作用域链查找
最简单的作用域链就是,局部作用域会查找到全局作用域:
var x = 1
function fn() {
return ++x;
}
console.log(fn());//结果为2
/*
fn的局部作用域中没有定义x变量,此时会向上级作用域查找,在全局作用域中定义了x这个变量并且赋值,所有++x
,,即是++1=2;所以结果为2
/*
下面是一张百度的图解: