JavaScript中函数的生命周期与预编译

JavaScript异步加载 JavaScript中函数的生命周期与预编译

一.JavaScript中函数的生命周期

1.当函数被声明时,它的作用域链就已经被确定了。此时将保存在作用域链中(这就是函数能记住自己出生环境的原因)。
2.函数的调用 创建自己的执行上下文(预编译)。
复制属性,创建作用域链
用arguments创建活动对象,初始化变量
将活动对象押入作用域顶端
函数代码块执行作用域链中的值
3.函数的终结 执行上下文(预编译)出栈
浏览器销毁未被引用的值

二.JavaScript中的预编译

1.JavaScript是一种单线程异步(详情请看小编上一篇文章),解释型的编程语言。
JavaScript的语言一大特点就是单线程,也就是说同一时间只能做一件事情。自上而下,解释一行,执行一行,不会通篇编译为一个文件再执行,也就是说不存在new文件名的事情。
2.语法分析:检查一遍js代码内有没有出现语法错误(比如少个分号,多个括号等),语法分析期间不会执行代码。
3.解释执行 任何的语法和语句全部会被转换成对象,GO(Global Object),AO(Active Object)

预编译会提前把函数体内的变量声明与函数声明依据规则放在该活动对象内AO(ACtive Object)

①函数执行前的的一瞬间生成AO(ACtive Object)对象。
②看参数,形参作为AO的属性名,实参作为AO的属性值
③看变量声明,变量名为AO的属性名,值为Undefined,如果遇到变量名与形参同名不用去理会。
④看函数体,函数名为AO的属性名,值为函数体,如果遇到同名的变量或形参名直接覆盖,(函数体覆盖属性值)

全局变量声明与函数声明依据规则放在全局对象内GO(Global Object)

①进入script标签,需要代码执行前的的一瞬间生成GO(Global Object)对象。
②看变量声明,变量名为GO的属性名,值为Undefined,如果遇到变量名与形参同名不用去理会。
③看函数体,函数名为GO的属性名,值为函数体,如果遇到同名的变量或形参名直接覆盖,(函数体覆盖属性值)

JavaScript中函数的生命周期与预编译

关于预编译的两个小规则


1.函数声明整体提升—(具体点说,无论函数调用和声明的位置是前是后,系统总会把函数声明移到调用前面)
2.变量 声明提升—(具体点说,无论变量调用和声明的位置是前是后,系统总会把声明移到调用前,注意仅仅只是声明,所以值是undefined),只有在解释执行阶段才会进行变量初始化,匿名函数不参与预编译。

JavaScript中函数的生命周期与预编译

喜欢小编的可以关注点一点。
小编虽然不能陪你一生,但能让你的基础知识满满登登。