函数执行前函数究竟做了什么?
一。 函数执行前,首先会通篇检查有没有语法或者代码写错的,如果有就直接报错,如果没有就会进行下一步:
二。 函数的预编译阶段
1. 首先会在函数内生成一个Ao对象,
2. 变量或者形参作为函数的属性名或者键名属性值是undefined
3. 实参给形参
4. 函数声明作为属性值,属性名为funciont(){}函数体
三。执行JS代码
作用域链
作用域链:当函数执行时会生成AO对象,并且把这个AO对象放在[[scope]]的最顶端,和函数创建时的环境,形成链式结构,我们把这种链式结构叫做作用域链。
作用域链 = 函数执行时的Ao对象+ 函数创建时的环境
这句话说白了就是当一个函数 **执行** 之后首先从自己本身里面找所需要的变量,注意,是执行之后,如果没有执行这个函数就相当于是一个死的函数,自己就不存在什么Ao对象了。
里面写什么都不会报错,如果自己里面没有所需要的变量,就顺着自己的父级去找,而自己所处的环境就是父级函数创建时候的Ao
变量查找规则: 沿着作用域链顶端 自上而下寻找变量
此时的[[scopes]]此时就是我们常说的作用域,其中存储了Ao对象的集合
Go对象:
函数预编译阶段也会也有Go对象,Go对象也可以当作是window对象吧,
也就是说当页面打开时候就会产生Go对象,页面中的函数都处于Go中
Go的执行有三个步骤
1.生成Ao对象
2.变量作为Go对象的属性名或键名
3.函数声明作为属性名,属性值为函数体