初识作用域

283 阅读3分钟

编程语言

几乎所有编程语言最基本的功能之一,就是能储存变量当中的值,并且之后能够对其访问和修改。那么这些变量储存在哪里?程序又是如何找到他们的?这些问题的解决方式便是设计一套规则来框定这些变量,并且可以修改或者访问他们,而这套规则便是作用域。

作用域的定义

知己知彼,百战不殆。想要充分学习作用域,我们就必须清楚地知道它的定义是什么,那么作用域的定义是什么呢?首先我们就要引出scope这个概念:

[[scope]]: 每个JavaScript函数都是一个对象,对象中有些属性是我们可以访问的,但有些不可以,scope这个属性就是其中之一,它只能被JavaScript引擎存取

而[[scope]]指的就是我们说的作用域,其中存储了运行期的上下文集合

运行期上下文

当函数执行时,会常见一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行上下文就会被销毁。请看下面的代码:

function a() {

    function b() {

        var b = 234

        console.log(a);//123

    }

    var a = 123

    console.log(a);//123
    
    b()

}
var glob = 100
a()

上面的代码中,声明了变量a,glob,b , function a() 的执行带来了function(b)的声明与执行,并在方法b里面打印a,上述的结果都是123。很显然就有了三个执行上下文,分别全局上下文GO:{ },a函数的执行上下文AO:{ },以及b函数的执行上下文AO:{ }。那么在执行的过程中发生了什么呢?这个时候我们又需要引出作用域链

作用域链

[[scope]]中存储了执行期的上下文对象的集合,这个集合成链式连接我们把这个链式连接叫做作用域链

图解

首先,在a函数被定义的时候,a函数便拥有了一个scope属性,属性中有一个作用域链数组scope chain[],下标0表示的是全局上下文GO:{ },1则表示的a的上下文AO:{ }。其中包含了this、 window 、document 、function a 以及变量glob,当其执行时,this指针仍旧指向window,产生自带的arguments[],以及b函数的声明和定义的变量a

b函数被定义时,也会拥有一个scope属性,其scope chain[],下标0表示的是全局上下文GO:{ },1则表示的a的上下文AO:{ },而2表示的是b的上下文AO:{ }。在b函数执行时,带来了变量b的定义以及变量a的打印。b函数结束后,其上下文便会被销毁,在a执行完成后,a的上下文也会被销毁.

白板(1)_00.jpg

来自于一个js小白的见解,若有错误,请在下方评论指出,谢谢!