js基础-作用域与作用域链

什么是作用域?

简单说就是在代码中定义的变量或者函数能起作用的范围       

什么是作用域链?

简单说就是JavaScript 在执行时查找变量的过程,它按照从当前作用域到全局作用域的顺序逐层向上搜索,直到找到变量或到达作用域的顶端。

详细说明:

首先说明一下函数本身就是一个对象,函数定义的时候它有一些自带的属性,比如 arguments、caller、length、name、prototype、proto、[[FunctionLocation]]、[[scope]]。其中scope是一个隐式属性,里面存的是执行期上下文的集合【其实这个集合成链式结构,就是作用域链】。那什么是执行期上下文呢?执行期上下文就是当函数执行时,会创建一个执行期上下文的内部对象。而且执行期上下文是独一无二的,每次调用函数都会创建一个新的执行期上下文。函数执行完成之后,他所产生的执行期上下文被销毁。

举例说明:

function a(){
    function b(){
        var bb = 123
    }
    var aa = 234
    b()
}
var glob = 100
a()

当a被定义的时候,a会发生下面这种情况。a的[[scope]]属性中存储了全局执行期上下文

当a被调用之后,a会创建一个属于自己的执行期上下文。当访问一个变量的时候,会沿着作用域链从顶端往下查找,比如在a函数中访问glob变量,就会现在a的AO对象中查找,如果没有就继续向下查找GO对象。

当b函数被定义的时候,b在a函数中定义,他会直接使用a的作用域

当b被执行的时候,会创建他自己的执行上下文。

其中b的作用域集合1位置存储的AO对象就是a的AO对象,他们俩是同一个对象。这就跟我们函数里面嵌套函数,内层函数可以访问外层函数里的变量。其中他们访问的这个变量是同一个。

关于结束:

b执行完之后会销毁其自己的AO对象,相当于把0位置的指针指向清除了。那么a函数执行完呢?同理,但是a的AO对象中存储了b函数,那么就相当于把b函数也直接消除了,等下次调用时会重新创建。

这样解释应该清楚了解作用域链与作用域了。希望大家可以指正错误的地方,共同进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值