函数预编译
JavaScript代码执行的时候会产生一个全局的执行期上下文对象GO{}(即global object)
执行期上下文形成过程:
1、创建GO{}
2、在全局中查找变量声明和函数声明并且其值为undefined,若函数名和变量名相同即为GO对象的同一个属性
3、将函数赋值给对应的变量名
而在每一个函数执行的前一刻都有一个全新的执行期上下文对象AO{}(即active object)
1、创建AO{}
2、在全局中查找变量声明和函数声明并且其值为undefined,若函数名和变量名相同即为GO对象的同一个属性
3、将函数的参数赋值给对应的变量名
4、将函数赋值给对应的变量名
作用域链
每一个函数都有一个自己的作用域链。作用域链就是由执行期上下文生成的一个链,自己的AO{}存在于作用域的最顶端,依次是GO{},此处GO是一个相对的概念。例:
<script>
function fun(){
var a = b = 0;
function fun1(){
console.log(b);
}
}
</script>
如上述的函数: fun()函数在执行的时候会生成一个自己的执行期上下文
AO{
a: 0,
fun1:functon(){
console.log(b);
}
}
而内层函数fun1()执行的时候也会生成一个自己执行期上下文对象
AO{ }
因为该函数里面既没有变量声明也没有函数声明,因此该对象为一个空对象。
但是在执行函数的时候会涉及b这个变量,它会先去找自己的AO{},但是并没有,于是去GO{}去找,这是它的GO{} 相当于就是外层函数得到的AO{}+全局的GO{},而外层函数AO{}中也没有b这个属性,于是去GO{}里找到b。 这个时候就形成了一条所谓的作用域链。
而fun1()作用域链最顶端就是自己的AO{},其次是外层原函数fun()函数的AO{},最后是全局的GO{},函数执行的环境就是在这个作用域链上。