作用域:一般理解为一个变量的作用范围。
1.全局作用域
(1)全局作用域在页面打开时被创建,页面关闭时被销毁。
(2)编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到。
(3)在全局作用域中有全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接调用。
(4)全局作用域中声明的变量和函数会作为window对象的属性和方法保存。
2.函数作用域
(1)调用函数时,函数作用域被创建,函数执行完毕,函数作用域被销毁。
(2)每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的。
(3)在函数作用域中可以访问到全局作用域的变量,在函数外无法访问到函数作用域内的变量。
(4)在函数作用域中访问变量、函数时,会先在自身作用域中寻找,若没有找到,则会到函数的上一级作用域中寻找,一直到全局作用域。
3.执行期上下文
当函数代码执行的前期会创建一个执行期上下文的内部对象AO(作用域)。
这个内部的对象是预编译的时候创建出来的因为当函数被调用的时候会先进行预编译。
在全局代码执行的前期会创建一个执行期的上下文的对象GO。
4.函数作用域预编译
(1)创建ao对象AO{}。
(2)找形参和变量声明将变量和形参名当做AO对象的属性名值为undefined。
(3)实参形参相统一。
(4)在函数体里面找函数声明值赋予函数体。
5.全局作用域预编译
(1)创建GO对象。
(2)找变量声明将变量名作为GO对象的属性名值是undefined。
(3)找函数声明值赋予函数体。