代码的执行原理
程序员文章站
2022-07-15 15:47:13
...
代码的执行原理
一、代码段
什么是代码段:一个script标签就是一个代码段。
JS代码在执行时,是一个代码段一个代码段执行。
二、代码执行的步骤
- JS代码在执行时分两个阶段:
- 1)预编译
- 2)代码执行
每一个阶段做的事情是不一样的。
先了解一下定义变量和声明变量:
通过var定义变量:var a = 110; 定义 = 声明+赋值
f();:使用function声明了一个函数;函数名是f 函数值是{};定义了一个函数f()
通过var声明变量:var a = 110; 说的声明仅仅是说var a 后面是赋值
1)预编译: 提升
把加var的变量进行提升:变量声明会提升,变量的赋值是不会提升。
提升是提升到代码段最前面
把使用function声明的函数进行提升 提升的是整个函数
2)代码的执行:一行一行执行
eg:
console.log(a); var a = 110; console.log(a);
- 输出:undefiend 和 110;
执行步骤: 1)提升:因为a是var进行声明的,所以要进行提升。提升只是提升了声明并没有提升变量的值,所以现在a是undefiend。
2)执行:第一行代码得到的是a的提升值,所以是undefiend,第二行将值110赋值给了a,所以当前a为number数据类型,值为110。因此第三行代码将a的值110输出。
三、初步了解执行上下文( Execute Context)
执行上下文( Execute Context):
为了方便,以后我们统一将执行上下文简称为:EC
- EC的作用:给代码提供数据
代码分两类:
- 全局代码 函数外面的代码叫全局代码
- 函数代码 一个函数就是一个局部代码
- 全局执行上下文:
全局代码在执行时时,就会产生全局的EC。 EC(G)
例如:- 局部执行上下文:
函数代码在执行时,就会产生局部的EC。调用一个函数就产生一个EC,调用100个函数,就产生100个EC。
- EC栈:
栈:杯子
每产生一个EC就会放到杯子中,说白了,就是杯子中放鸡蛋。
栈:先放进去的后出来
执行上下文详解
我们知道,当代码执行的时候随之就产生了一个叫执行上下文的东西,也就是他使我们得到了最后的数据。
但是,执行上下文是怎么执行的呢?让我们一起探究一下吧!
我们知道,当代码进行执行的时候,必然要遵守的规则,于是他必然要经过预编译然后执行。
(何为预编译前面已经介绍,就不在讲解了。)
要用到的相关名称:ECStack:(Execute context stack):执行上下文栈
EC(G)(Execute context (globle):存放全局变量的执行上下文:包含:var 定义的全局变量,引用数据类型)
**EC(f)????*函数f执行时产生的执行上下文
GO(globle object):存放全局对象
VO(varibale object):var创建的全局变量对象和引用数据类型对象
AO:var创建的局部数据对象(如果对数据对象不熟悉,可以访问:JS中的数据类型及转换)注意:数据在EC(G)中,就一定在GO中,反之不一定
具体步骤如下:
- 1、在预编译的时候就产生了一个叫ECStack的大容器,他的里面放了EC(G)。EC(G)中有个VO用来存放提升的数据(提升了的变量的声明)。
- 2、提升完毕,开始一步步执行代码。
1)执行代码,给VO里面的变量进行赋值
2)当调用函数的时候就会产生一个EC(f),每调用一次就产生一个EC(f),步骤:先对函数进行形参的赋值,然后看有没有提升,如果有提升,将其保存在AO中,然后进行执行,如果里面还有函数重复当前步骤。
看几个例子了解一下吧!