作用域链相关

想把作用域链相关的写清楚,想到哪算哪,可能不是很有条理,这里讨论的都是基于当前理解

先来一起弄清楚几个名词,之后再看看理解到哪一步了

作用域

执行环境(execution context)

又称执行上下文,主要包括 VO(变量对象),scope属性(指向作用域链头结点的指针),this(环境对象)这三个部分,在开始之前我们可以先回忆一下平时看过,或者写过的js文件。其中一般包含变量声明,函数声明。

执行环境的产生包括两个阶段,来看看每个阶段执行环境的成员

1:创建阶段(还没有执行内部语句)

VO:寻找在此环境中定义的变量,包括函数的形参,声明的变量,声明的函数(帮助理解声明提升) 形参会用来初始化arguments object,这是一个类数组。声明的变量放入VO中,赋初值为undefined,若变量有重名,不管!函数声明会将变量名放入VO,若有重复,那么后来者覆盖前者!

scope:作用域,设置当前scope属性的值,指向链表头结点

this:设置this的值(在es5里,这个需要单独说)

2: 调用阶段

根据传入的参数值,当前的作用域,对VO进行赋值,执行相应代码,与创建阶段相比,改变了VO属性值

那么在一个js文件运行的时候(按照写作逻辑,从上往下执行),就会产生不同的执行上下文,构成了执行上下文栈,首先是全局环境入栈,之后是一个个的局部环境入栈,出栈,而全局环境一直在栈底。这里要对执行环境的级别有印象,也可以理解为内层,外层函数。

最后提一下函数即使嵌套,但是我们只需要关注全局环境(Windows对象),局部环境(具体执行到某个函数)

作用域

其实是词法作用域(静态作用域),是由函数定义时的决定的,把它解释为函数可以访问的变量,可以调用的函数,它是一个对象(函数由内向外进行遍历,一直到window对象)。es5只有全局作用域,函数作用域,{}之间的内容不构成块级作用域。可以把作用域和之前的VO做个比较,VO是在当前环境下产生的变量对象,而作用域scope属性是一个指向作用域链表头结点的指针,此时作用域是VO与之前作用域链合并的结果。

闭包

定义:可以访问另一个函数作用域的变量的函数

这里的输出结果都是arr.length,解释清楚涉及到执行环境,引用传值(over)

这里可以得到想要的结果,解释时用到执行环境,函数按值传参。闭包常见的形式是在函数内返回一个对象,保存了对外部对象的引用,引用计数不清除,内存不会回收变量,下面有一个典型的闭包例子

就先写到这里了,以后有了更好的理解再来修改!!
https://www.jianshu.com/p/eff18975a51e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值