JS:执行环境、作用域链、变量提升、this

重点:每一个函数都有自己的执行环境,每个执行环境都有一个与之关联的变量对象,环境中定义的变量和函数都保存在这个对象中。
这个对象就是执行上下文对象:

executionContextObj={
	//变量对象
	variableObject:{/*函数中的arguments对象,参数、内部的变量以及函数声明*/]
	//作用域
	scopeChain:{/*variableObject以及所有父执行上下文中的variableObject*/},
	this:{}
}

根据这个执行环境我们解析以下几个问题:

1、查找变量的顺序(知识点:作用域与作用域链)
executionContextObj中的scopeChain是这个函数的作用域,scopeChain=variableObject+[[scope]]
varibaleObject为当前的变量对象,[[scope]]为父执行上下文的作用域链,variableObject位于前面,所以查找变量时总是先从自身查找,然后依次到父执行上下文中查找。
即当在函数中查找一个变量时,是根据作用域查找的。

2、this是什么?和作用域的区别
this总是指向函数调用时的环境(动态作用域即运行时上下文)
作用域保存的是函数被定义时的环境(静态作用域即编程时的上下文)
我们知道javascript没有块级作用域,最小单位为函数,作用域能访问到函数中的变量,this则指向调用者,即可访问对象中的变量。

《javascript设计模式》中指出:只有函数具有作用域。Javascript中的作用域是词法性的。函数是运行在定义它们的作用域中,而不是运行在调研用它们的作用域中。

以上也是能够创建闭包的原因,从而可以用闭包实现私有成员。
各类this指向参考文章:一网打尽 this,对执行上下文说 Yes
3、提升,函数提升总是优先于变量提升(为什么可以先使用后定义)
参考:[【译】JS的执行上下文和环境栈是什么?]

在调用函数时,但是在执行里面的代码之前,会对函数进行一次扫描,解释器通过扫描传入的参数或参数的函数、本地函数声明和局部函数声明来创建executionContextObj。此扫描的结果将称为executionContextObj中的variableObject。

就是因为在代码运行之前,解释器已经扫描过在函数中变量和函数,已经创建这些变量,所以在代码执行时,这些变量就可以直接使用,并且函数的提升优先于变量。

借鉴文章:【译】JS的执行上下文和环境栈是什么?https://juejin.im/post/5c855410e51d45555e2626fd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值