作用域
全局作用域
- 全局作用域在页面打开时被创建,页面关闭时被销毁。
- 编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到。
- 在全局作用域中有全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接调用
- 全局作用域中声明的变量和函数会作为window对象的属性和方法保存。
函数作用域
- 调用函数时,函数作用域被创建,函数执行完毕,函数作用域被销毁。
- 每调用一次函数就回创建一个新的函数作用域,它们之间是互相独立的。
- 在函数作用域中可以访问到全局作用域的变量,在函数外无法访问到函数作用域内的变量。
- 在函数作用域中访问变量,函数时,首先会在自身作用域中寻找,没有找到就会到函数的上一级作用域中寻找,一直到全局作用域。
执行期的上下文
- 当函数代码执行的前期,会创建一个执行期上下文的内部对象 AO(作用域)
- 这个内部的对象是预编译的时候创建出来的,因为当函数被调用的时候,会先进行预编译。
- 在全局代码执行的前期会创建一个执行期的上下文对象GO。
函数作用域预编译
- 创建AO对象
- 找形参和变量声明,将变量和形参名当做AO对象的属性名,值为undefined。
- 将实参形参相统一。
- 在函数体里寻找函数声明,值赋予函数体。
全局作用域的预编译
- 创建GO对象。
- 找变量声明,将变量名作为GO对象的属性名,值是undefined。
- 找函数声明,值赋予函数体。
function fn(a,b){
console.log(a) //function a(){}
var a =10
console.log(a) //123
console.log(c) //function c(){}
function a(){}
if(false){
var d = 55 //undefined
}
console.log(d) //undefined
console.log(b) //undefined
var b = function(){} //这里是函数表达式,不是函数声明
console.log(b) //function (){}
function c(){}
console.log(c) //function c(){}
}
fn(1,2)
//1. 创建AO对象
//2. 找形参和变量声明,将变量和形参名当做AO对象的属性名,值为undefined。
//3. 将实参形参相统一。
//4. 在函数体里寻找函数声明,值赋予函数体。