预编译
一、js运行三部曲
1. 语法分析 2. 预编译 3. 解释执行
二、预编译前奏
1.imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有。
如 a = 10 , 则 window.a = 10;
如function test() {
var a = b = 123;
}
test();
先将123赋给b,然后声明a,然后将b赋给a;
console.log(b) --> 123;
console.log(a) --> undefined
2.一切声明的全局变量,全是window的属性, 如
var a = 123,则window.a = 10;
console.log(a) --> console.log(window.a)
window就是全局的域
三、预编译
预编译发生在函数执行的前一刻
局部(AO)
1.创建AO对象 (Activation Object)(执行期上下文)
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
全局(GO) window === GO
1.生成了一个GO对象 Global Object
2.找变量声明,将变量作为GO属性名,值为undefined
4.在函数体里面找函数声明,值赋予函数体
例一:(局部)
<script type="text/javascript">
function fn(a) {
console.log(a); //f a() {}
var a = 123;
console.log(a); //123
function a() {}
console.log(a); //123
var b = function () {}
console.log(b); //f () {}
function d() {}
}
fn(1);
</script>
1.创建AO对象
2. AO{
a: undefined,
b: undefined,
}
3. AO{
a: 1,
b: undefined,
}
4. AO{
a: function a() {},
b: undefined,
d: function d() {}
}
执行函数对a赋值
AO{
a: 123,
b: undefined,
d: function d() {}
}
执行函数对b赋值
AO{
a: 123,
b: function () {},
d: function d() {}
}
例二:(全局)
<script type="text/javascript">
console.log(a); //f a() {}
var a = 123;
function a() {}
console.log(a); //123
</script>
1.创建GO对象
2. GO{
a:undefined;
}
4. GO{
a:function () {}
}
执行函数对a赋值
GO{
a:123
}
网友评论