一尚胞、預(yù)編譯
1、檢查通篇的語法錯誤
2帜慢、預(yù)編譯的過程
函數(shù)聲明整體提升笼裳。
變量只有聲明提升,賦值不會提升粱玲。
3躬柬、解釋一行,執(zhí)行一行
二抽减、暗示全局變量
未被聲明就賦值了的話允青,那么該變量就是全局變量,所有權(quán)歸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
三卵沉、預(yù)編譯的過程:
例子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)
創(chuàng)建 AO activation object 活躍對象颠锉,函數(shù)上下文。
AO={
第一步:尋找函數(shù)的形參和變量聲明
a=undefined
b=undefined
第二步:把實參的值賦值給形參
a=undefined -> 2
b=undefined ->
第三步:尋找函數(shù)聲明賦值給函數(shù)體
a=undefined -> 2 -> function a() { }
b=undefined -> -> function () { }
d=function d() { }
第四步:逐行執(zhí)行
b=undefined -> -> -> function () { }
}
例子2:
第一步:找形參和變量聲明
a=undefined
b=undefined
c=undefined
第二步:把形參給實參
a=undefined -> 1
b=undefined
c=undefined
第三步:把函數(shù)聲明給函數(shù)體
因為聲明了:function b() { }和 function d() { }
所以:
a=undefined -> 1 ->
b=undefined -> -> function b() { }
c=undefined -> ->
function d() { }
第四步:從上到下逐行執(zhí)行
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//相當(dāng)于在全局聲明變量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 的作用:返回一個值到函數(shù)外部琼掠,2.終止函數(shù)
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
// }