小编给大家分享一下JavaScript执行上下文的处理过程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
在《深入学习js之——执行上下文栈》中说过,当JavaScript代码执行一段可执行代码(可执行代码)时,会创建对应的执行上下文(执行上下文)
对于每一个执行上下文,都有三个重要的属性:
变量对象(变量对象VO)
作用域链(作用域链)
本文我们结合着这三个部分的内容,讲讲执行上下文的具体处理过程。
思考题
在《深入学习js之——词法作用域和动态作用域》中,提出这样一道思考题:
//思考题一: var=胺段?全球scope"; 函数checkscope () { var=胺段?当地scope"; 函数f () { 返回范围; } 返回f (); } checkscope ();//思考题二: var=胺段?全球scope"; 函数checkscope () { var=胺段?当地scope"; 函数f () { 返回范围; } 返回f; } checkscope () ();
两段代码都会打印<代码>局部范围> 代码,但是还是有些许差异的,本文就详细的解析<强>执行上下文栈强>和<强>执行上下文>强劲的具体变化过程。
具体分析
我们分析第一段代码:
var范围=叭騭cope"; 函数checkscope () { var=胺段?当地scope"; 函数f () { 返回范围; } 返回f (); } checkscope ();
执行过程如下:
1,执行全局代码,创建全局执行上下文,<强>全局上下文被压入执行上下文栈强>
ECStack=[ 中 ];
2,全局上下文初始化
globalContext={ 签证官:(全球) 范围:[globalContext.VO], :globalContext.VO }
2,初始化的同时,checkscope函数被创建,保存作用域链到函数内部的属性<代码>[[范围]]代码>
checkscope。[[scope]]=[ globalContext.VO ];
3,执行checkScope函数,创建checkScope函数执行上下文,checkScope函数执行上下文被压入执行上下文栈:
ECStack=[ checkscopeContext, 中 ];
4, checkscope函数执行上下文初始化:
1。复制函数[[scope]]属性创建作用域链,
2。用参数创建活动对象,
3。初始化活动对象,即加入形参,函数声明,变量声明,
4。将活动对象压入checkscope作用域链顶端,引用>同时f函数被创建,保存作用域链到f函数的内部属性<代码>[[范围]]代码>
checkscopeContext={ AO: { 参数:{ 长度:0 }, 范围:定义, f:引用函数f () {} }, 范围:(AO, globalContext.VO), :未定义的 }5,执行f函数,创建f函数执行上下文,f函数执行上下文被压入执行上下文栈
ECStack=[ fContext, checkscopeContext, 中 )6 f函数执行上下文初始化,以下跟第4步相同:
1。复制函数<代码>[[范围]]> 代码属性创建作用域链
2。用参数创建活动对象
3。初始化活动对象,即加入形参,函数声明,变量声明
4。将活动对象压入f作用域链顶端引用>fContext={ AO: { 参数:{ 长度:0 } }, 范围:[AO, checkscopeContext。AO, globalContext.VO], :未定义的 }7 f函数执行,沿着作用域链查找值范围,返回范围值
8 f函数执行完毕,f函数上下文从执行上下文栈中弹出
ECStack=[ checkscopeContext, 中 )9日checkscope函数执行完毕,checkscope执行上下文从执行上下文栈中弹出
ECStack=[ 中 )以上是“JavaScript执行上下文的处理过程”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
JavaScript执行上下文的处理过程