javaScript深入理解执行上下文
js代码在执行的过程中会形成一个执行上下文的环境每次调用函数的时候又会产生一个函数的执行上下文环境。
当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到
全局上下文环境。处于活动状态的执行上下文环境只有一个。
再直白的说法就是其实这是一个压栈出栈的过程——执行上下文栈如下图
栈:在计算机中,栈是一种数据结构,也就是操作数据的一种方式。
特点:先进后出。
队列:先进先出。
接下来通过一个简单的函数在谷歌浏览器中运行的流程来理解执行上下文栈
<strong>其中anonyomus为全局上下文栈;f 与g 都是函数上下文栈。当函数的上下文栈执行完后会被销毁当f和g两个函数执行完毕后就会出栈然后销毁,最后只剩下全局上下文环境。</strong>
具体分析如下:
当全局代码一执行,就会产生一个全局的执行上下文,此时这个全局的执行上下文,位于栈底。
当调用g时,就会产生一个函数的执行上下文,这个执行上下文入栈了,位于全全局执行上下文上面的。
当调用函数f时,就会又产生一个函数的执行上下文,这个上下文入栈后就会位于函数g上下文的上面。
当 f 函数调用完毕后,它要出栈,g就位于栈顶了,当g调用完毕后,g也出栈了,全局执行上下文就位于栈顶了。当全局代码执行完毕后,全局执行上下文也销毁了,程序结束。
接下来看执行上下文的作用
执行上下文的主要作用就是为了提供数据的。
首先是函数的执行上下文主要分为以下的两个部分
1,第一部分是函数题中的 变量,定义的函数,以及函数自带的arguments对象。
2,第二部分是父级函数的执行上下文。
全局的上下文为:
定义的全局的变量以及函数。
了解过执行上下文之后,接下来可以看下有关函数中的作用域链
在js中作用域中主要有全局作用域,局部作用域 以及ES6中的块级作用域,
主要参数用let定义变量。
全局作用域的特点:全局作用域不能访问局部作用域。
局部作用域的特点:局部作用域可以访问全局作用域。
当在一个函数内部又定义了一个函数,此时,就要形成一个上下文的从里到外的引用关系,那么这个引用关系也可以叫作用域链如下图:
在JS高级中,有两条链:
作用域链:帮助我们去确定,在函数中如何去确定一个变量的值。
原型链:帮助我们去确定,在对象中如何去确定一个属性的值。
只有function才能划分作用域,当函数嵌套时,就会产生一个作用域链。
知道的有限,还有什么方面的欠缺,希望大家多多指出,在进行更新。
今天get新技能:
zepto源码分析
共同学习,写下你的评论
评论加载中...
作者其他优质文章