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