预编译
js属于单线程的解释型语言,单线程暂且不论。
解释型语言就是读一行执行一行的意思,不过在执行之前,会有语法分析和预编译两个过程。
语法分析意思就是在执行代码之前,会先扫描代码一遍,但是不执行,只是为了检测有没有什么语法错误等等。
预编译(预编译发生在函数执行的前一刻)
函数声明整体提升:
如果写了一个函数声明,系统会把其提升到逻辑的最顶部,所以无论在哪里调用,实际上都是在其下面调用
变量声明提升:var a=123;
var a叫做变量声明,a=123;叫做变量赋值。
只要声明了,就会提升到顶部,但是在没赋值之前,输出的值为undefined;
函数体内预编译的四部曲:
1.创建AO对象 Activation Object(执行上下文)
AO{
a: ,
b: ,
d:
}
2.找形参和变量声明,将变量和形参作为AO的属性挂上去,值为undefined。
3.将实参值与形参相统一,就是将实参的值放到形参中去。
4.在函数体中找函数声明,将函数名作为AO的属性挂上去,将函数的值(也就是函数体)挂在AO里的对应函数名上。(如果之前变量或形参存在同名属性,这时都会被覆盖!!!)
执行时,都会从AO中找对应属性和方法!!!
全局上的预编译
Go===window
1.创建GO对象 Global Object
2.变量声明提升,赋值undefined
3.函数声明提升,赋值
全局变量
一切变量未经声明,就直接赋值,就属于全局变量,即全局对象window的变量;
一切声明的全局变量,归window所有。(window就是全局的域(作用域其实也是一个对象))