不知道你知不知道的执行上下文和执行栈

js的执行顺序我们都知道是从上到下进行执行了,而且都知道js执行前会进行预编译。
预编译的时候,先一行一行的去解析代码,找到var等声明变量。进行预处理。在找到匿名函数进行解析,再去一行行的去执行。
这里就能有我们经常遇到的变量提升,看下面的代码。

	console.log(a); //哈哈
	var a = '哈哈';

这里就发生了变量提升。
好像说跑题了奥。我们回到执行上下文。
执行上下文
我知道大家都知道执行上下文有三种;
1.全局执行上下文。 全局的都知道,在执行js的时候就会存在全局执行上下文。在一个程序中只有一个全局执行上下文。(在浏览器中会创建一个window对象,并把this等于这个全局对象)
2.函数执行上下文。 函数执行上下文执行js遇到函数执行的时候就会创建一个新的函数执行上下文。一个程序中可以有多个函数执行上下文,函数又会有自己的this。es6中箭头函数没有;
3.eval的执行上下文。(eval:把js的字符串当js去执行)eval的执行上下文是一个特殊的执行上下文。
执行上下文说了不说执行栈有点说过不去了。
执行栈,有被叫调用栈。
执行栈的特点就是后进先出。执行栈也就是来存储代码运行时创建的执行上下文的。
看段代码来理解吧

	function a(){
    
    
		b();
	}
	function b(){
    
    
		c();
	}
	function c(){
    
    
		console.log('哈哈哈');
	}
	a(); //哈哈哈
	
	//伪代码解释
	let ExecutionStack = [];
	ExecutionStack.push('GlobalContext');
	ExecutionStack.push('a');
	ExecutionStack.push('b');
	ExecutionStack.push('c');
	ExecutionStack.pop('c');
	ExecutionStack.pop('b');
	ExecutionStack.pop('a');
	ExecutionStack.pop('GlobalContext');

执行结果应该没有争议了。
在段代码执行的时候,我们用数组来进行解释。
Executionstack这个数组。开始执行这段代码的时候,一个全局执行上下文就放到这个Executionstack数组中。
然后执行了a函数 就会把代用a时创建的执行上下文,放到执行栈里。
下面的b ,c是同样的道理,放到执行栈中。
这时候c执行完成。就要把c个从执行栈中删除。
在后面就是b,然后就是a依次删除;
最后到程序执行完成,最后就是全局执行上下文。
看到这应该理解执行栈是什么了吧。
执行上下文创建的过程发生了什么呢。
我理解的也有点模糊,我就不误人子弟了。可以去看一下这边
https://262.ecma-international.org/6.0/

参考文档:https://juejin.cn/post/6844903682283143181#heading-9

猜你喜欢

转载自blog.csdn.net/weixin_44655037/article/details/116747353