JavaScript的预编译
一、预编译
1、检查通篇的语法错误
2、预编译的过程
函数声明整体提升。
变量只有声明提升,赋值不会提升。
3、解释一行,执行一行
二、暗示全局变量
未被声明就赋值了的话,那么该变量就是全局变量,所有权归window
a = 2
console.log(a);//2
document.writeln(window.a)//2
function test() {
var a = b = 1
}
test()
//console.log(a); //a is not defined
console.log(b);//1
console.log(window.a);//undefined
console.log(window.b);//1
console.log(a());//2 undefined
var a = 1
function a() {
console.log(2); //1 2
}
console.log(a);//3 1
console.log(a);//ƒ a(a) {...}
function a(a) {
var a = 10
var a = function () {
}
}
var a = 1
三、预编译的过程:
例子1:
function test(a) {
console.log(a); //ƒ a() { }
var a = 1
console.log(a); //1
function a() { }
console.log(a);//1
var b = function () { }
console.log(b);//ƒ () { }
function d() { }
}
test(2)
创建 AO activation object 活跃对象,函数上下文。
AO={
第一步:寻找函数的形参和变量声明
a=undefined
b=undefined
第二步:把实参的值赋值给形参
a=undefined -> 2
b=undefined ->
第三步:寻找函数声明赋值给函数体
a=undefined -> 2 -> function a() { }
b=undefined -> -> function () { }
d=function d() { }
第四步:逐行执行
b=undefined -> -> -> function () { }
}
例子2:
第一步:找形参和变量声明
a=undefined
b=undefined
c=undefined
第二步:把形参给实参
a=undefined -> 1
b=undefined
c=undefined
第三步:把函数声明给函数体
因为声明了:function b() { }和 function d() { }
所以:
a=undefined -> 1 ->
b=undefined -> -> function b() { }
c=undefined -> ->
function d() { }
第四步:从上到下逐行执行
a=undefined -> 1 -> -> 1
b=undefined -> -> function b() { } -> 6
c=undefined -> -> -> 6
function d() { }
function test(a, b) {
console.log(a); //1
c = 0;
var c;
a = 5
b = 6
console.log(b); //6
function b() { }
function d() { }
console.log(b);//6
}
test(1)
例子3:
a = 1
function test() {
console.log(a);//undefined
a = 2
console.log(a);//2
var a = 3
console.log(a);//3
}
test()
var a
// GO={
// a:undefined
// 1
// test:function test(){}
// }
//AO 有a就不会去GO找
// AO={
// a:undefined
// 2
// 3
// }
例子4:
function test() {
console.log(b); //undefined
if (a) {
var b = 2
}
c = 3//相当于在全局声明变量c
console.log(c);//3
}
var a;
test();
a = 1
console.log(a);//1
// GO={
// a=undefined
// test:f test() {}
// 1
// }
// AO={
// b=undefined
// c=3 全局
// undefined
// 3
// }
例子5、
// 1. return 的作用:返回一个值到函数外部,2.终止函数
function test() {
return a
a = 1
function a() { }
var a = 2
}
console.log(test()); //ƒ a() { }
// AO={
// a=undefined -> function a() { }
// }
例子6、
a = 1
function test(e) {
function e() { }
arguments[0] = 2
console.log(e);//2
if (a) {//a 是undefined,所以返回false
var b = 3
}
var c;
a = 4
var a;
console.log(b);//undefined
f = 5
console.log(c);//undefined
console.log(a);//4
}
var a;
test(1)
console.log(a);//1
console.log(f);//5
// GO={
// a=undefined -> 1
// test:function test(){}
// }
// AO={
// e:undefined -> 1 -> function e() { } -> 2
// b:undefined
// c:undefined
// a:undefined -> 4
// }