预编译前奏
1.imply global暗示全局变量,如果变量未经申明就赋值,此变量就为全局变量所有
function fun(){ a=20 } fun(); console.log(a)/*a为20*/
2.一切声明的全局变量,全是window的属性。
即var a=10等于window.a
var a=10; var b=20; var c=30; console.log(window)
3.预编译发生在函数声明的前一刻
预编译主要分为两种:
全局(相当于只要局部的2,4部分):
全局是script标签中的代码,不包括函数执行
1.生成一个GO对象找声明变量,变量名为属性名,值为undefined;
2.找函数声明,函数名为属性名,值为函数体,如果函数名和变量名一样则无情覆盖
函数内部(局部):
1创建AO对象
2找形参和变量声明,将形参和变量名作为AO的属性名,值为undefined
3.将实参和形参统一------也就是将实参的值赋给形参
4找函数声明,函数名为属性名,值为函数体,如果函数名和变量名一样则无情覆盖
全局实例:
<script type="text/javascript"> console.log(a) var a=10; console.log(a) function a(){} console.log(a) </script>
1.创建GO对象:
GO{
a:undefined
}
2.找函数声明,函数名为属性名,值为函数体,如果函数名和变量名一样则无情覆盖:
GO{
a:function a(){}
}
3.逐行执行:
函数内部实例:
<script type="text/javascript"> function fn(a){ console.log(a); var a = 123; console.log(a); function a(){} console.log(a); var b = function(){} console.log(b); function d(){} } fn(1); </script>
1.创建AO对象(执行上下文):
AO{
}
2.找形参和变量声明,将将形参和变量名作为AO的属性名,值为undefined:
AO{
a:undefined
b:undefined
}
3.将实参和形参统一------也就是将实参的值赋给形参:
AO{
a:1
b:undefined
}
4.找函数声明,函数名为属性名,值为函数体,如果函数名和变量名一样则无情覆盖
AO{
a:function a(){}
b: undefined
}
5.然后逐行执行: