函数作用域初探:
什么是函数作用域?我用很通俗的概念概括了一下:每一个函数在document的每个地方都相当于一个独立的空间,因为有这个独立的空间,所以同级函数之间是不能相互访问的。每一个函数在诞生的时候都会有一个自己独特的域用来存储自己的元素,这个域就是自己的作用域也就是上文所说的独立空间。(我觉得函数其实也可以被看作一个对象,而函数里的一些元素,可以被看做该函数的属性)
暗示全局变量(Imply global):任何变量,在全局的任何地方未声明就被赋值使用时,这个变量就叫做暗示全局变量,这个变量存储在window的域里边。(因为window也是对象,所以也可以通过元素给"."出来)。
预编译:
程序执行的步骤:
1、语法分析:系统通过通篇扫描会将语法,标点等低级错误反馈给我们。
2、预编译:
以前总以为预编译只是加在函数上的,在查阅了资料之后才知道,预编译也是会发生在全局上的。而经过这个全局预编译所产生的域(GO),就是window。
函数预编译五部曲:
1、在函数执行的前一刻创建AO对象(Activation Object):执行期上下文。
作用:这个AO就是我们所理解的作用域,也就是函数由于执行而产生的存储的仓库。
2、寻找函数内的形参和变量的声明,将变量和形参的名字当作AO的对象写出来,并赋undefined。(每一个函数是一个独立的整体,函数里的if、for等,是不影响该函数的预编译的)
3、将形参和实参进行对应的赋值。
4、寻找函数内部的函数定义(不是函数表达式,因为通过函数表达式定义的函数实际上还是存储在某个变量之中,而这个变量在上一步已经被寻找过了)。将函数名作为AO的属性名,添加进AO对象里,然后再将该函数的函数体赋值到相应的变量名字里边。
5、再按照该函数内部程序的顺序进行赋值等。。。
全局的预编译GO(Global Object):
全局的预编译原理与函数的预编译类似,只不过少了第三步形参实参相统一的那步。