分享更有价值
被信任是一种快乐

Javascript中的执行上下文如何创建

文章页正文上

这篇文章主要介绍“Javascript中的执行上下文如何创建”,在日常操作中,相信很多人在Javascript中的执行上下文如何创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Javascript中的执行上下文如何创建”的疑惑有所帮助!接下来,请跟着小编一起来学习吧! 这里为了稍微将案例复杂化一点,做了一点点修改,但是并没有改变原题所考察的点。

functionfunc(value){
getValue=function(){
console.log(value);
};
returnthis
}

functiongetValue(){
console.log(5);
}

Func(1).getValue();//为什么是1呢?

执行全局代码,创建全局执行上下文,全局上下文被压入执行上下文栈

ECStack=[globalContext];

初始化全局上下文

globalContext={
VO:{
func:referencetofunctionfunc(){},
getValue:referencetofunctiongetValue(){}
},
Scope:[globalContext.VO],
this:globalContext.VO//全局上下文
}

初始化全局上下文同时创建了两个函数,因此也会保存他们父级作用域链在他们的内部属性 [[scope]] 内

func.[[scope]]=[
globalContext.VO
];
getValue.[[scope]]=[
globalContext.VO
];

此时开始执行代码,执行到最后的语句时先执行 func 函数,也就创建按步骤 func 函数执行上下文:复制函数 [[scope]] 属性创建作用域链用 arguments 创建活动对象初始化活动对象将活动对象压入 checksfunccope 作用域链顶端。创建this,简单分析:MemberExpression 值为func,func是一个函数对象,理所当然是一个Reference ,其中它的 base value 是 EnvironmentRecord ,所以它的 this 值为 ImplicitThisValue(ref),返回值始终是 undefined ,非严格模式下,其值会被隐式转换为全局免费云主机、域名对象。

funcContext={
AO:{
arguments:{//数组
0:1,
length:1
}
},
Scope:[AO,globalContext.VO],
this:undefined
}

可能有人会有疑问,func 里的 getValue 呢?,因为它并没有变量申明,因此他其实是一个属性的赋值操作,在后面运行时才会被执行。创建函数执行上下文后压入执行上下文栈

ECStack=[
funcContext,
globalContext
];

函数开始执行,此时就是为什么最后输出是1的关键了,第一句赋值操作,那么就需要沿着执行上下文去找变量 getValue,那么我们就来看 funcContext 中的作用域,首先找到 funcContext.AO 显然并不存在 getValue 这一属性,那么沿着作用域链往上找,找到了globalContext.VO ,找到了 getValue ,这时候就会给全局作用域下的 getValue 属性重新赋值,赋的是一个函数的传新版本,也就重新创建了函数作用域,将这个全新的 getValue 函数的父级作用域链保存在它在他们的内部属性 [[scope]] 内:

getValue.[[scope]]=[funcContext.AO,globalContext.VO];

然后才继续返回 this ,查找 funcContext 的 this ,即返回undefined;func 执行上下文出栈

ECStack=[globalContext];

继续执行Func(1).getValue(),前半部分返回了 undefined ,此时系统隐式转换为全局变量对象,从全局变量对象中找到 getValue 属性。这时候我们发现 getValue 早已不是当年那个少年,执行全新的 getValue 的函数执行上下文并入栈:

getValueContext={
AO:{
arguments:{//数组
length:0
}
},
Scope:[AO,funcContext.AO,globalContext.VO],
this:undefined
}ECStack=[
getValueContext,
globalContext
];

函数开始执行,发现她要输出 value ,沿着作用域去找,getValueContext.AO 中并没有这个属性, 继续往下找找到 funcContext.AO(注意! ),在形参中 找到了 value 那么就输出对样的值,也就输出了1。函数执行完毕,getValueContext 和 globalContext 相继出栈并销毁,代码运行完毕。到此,关于“Javascript中的执行上下文如何创建”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注云技术网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: jquery中怎么隐藏表单字段

这篇文章主要介绍“jquery中怎么隐藏表单字段”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“jquery中怎么隐藏表单字段”文章能帮助大家解决问题。 首先,要隐藏一个表单字段,需要使用CSS中的”d免费云主机、域名i…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册