作为一种解释性语言,为了使函数执行时不产生混乱JavaScript引入了一些机制。
首先是进行语法分析,排除一些低级的语法错误。
然后是预编译。
最后在一行一行解释执行(跳过声明语句)。
变量提升
在JavaScript中,函数及变量的声明都将被提升到函数的最顶部。
<script type="text/javascript">
console.log(a); //undefined
console.log(func); // func(){ var b = 0; }
function func(){
var b = 0;
}
var a = 10;
</script>
注:**这里只是把声明提升了,赋值语句还是要等解释到这一行的时候执行。**所以a是undefined。
预编译
预编译又有全局的和函数发预编译
-
函数预编译:
1.创建AO对象 AO(Activation Object),即执行期上下文。
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
预编译结束后开始执行函数体。
// 1.AO{
// }
// 2.AO{
// a:undefined;
// b:undefined;
// }
// 3.AO{
// a:3;
// b:undefined;
// }
// 4.AO{
// a:function a(){};
// b:undefined;
// }
function a (a){
console.log(a); //function a(){}
console.log(b); //undefined
function a(){}
var b = 1;
a = 2;
console.log(a); //2
console.log(b); //1
}
a(3);
- 全局预编译
1.创建GO对象 (Global Object)
2.找变量声明,将变量名作为GO属性名,值为undefined
3.找函数声明,值赋予函数体
console.log(a); //undefined
console.log(b); //function b (){ }
var a = 0;
function b (){ }
console.log(a); //0
注意:全局变量全是Windows属性。