function countFn(count){for(var i =0; i < count; i++){console.log(i)// 0 1 2 3 4}var i // 重復 視而不見console.log(i)// 5}countFn(5)
function test(a){// 預編譯第一步,將形參添加到AO時var avar aconsole.log(a)// 1}test(1)// 打印// f a(){}// 1// 1// f (){}
function test(a){console.log(a)// fn avar a =1;console.log(a)// 1function a(){}console.log(a)// 1var b = function (){}console.log(b)// fn function d(){}}test(2)
function test(a, b){console.log(a)// 1c =0console.log(c)// 0var ca =5console.log(a)// 5console.log(b)// f b(){}b =6console.log(b)// 6function b(){}console.log(d)// f d(){}function d(){}console.log(b)// 6console.log(d)// f d(){}}test(1)
AO ={a:undefined → 1 → 5,b:undefined → f b → 6,c:undefined → 0,d: f d
}
二、全局
在通篇js執行前,創建GO(global object)全局上下文(即window)
尋找變量聲明
尋找函數聲明
執行(不要忘記賦值、注意執行順序)
函數表達式顯然是報錯,GO里test是變量undefined
test()var test = function (){}
function test2(){}
GO ={test:undefined → f test(){}test2: f test2(){}}// 打印// f a(){}// undefiendGO ={b:undefineda:fa
}
console.log(b)// undefinedvar b =3;
console.log(b)// 3
console.log(a)// f a(a)
function a(a){console.log(a)// f a()a()// undefined 5var a =2;console.log(a)// 2function a(){console.log(b)var b =5;console.log(b)}}a(1)
GO ={b:undefineda:fa(a)}
AO ={a:undefined → 1 → fa() → 2b:undefined →
}
不要混淆:AO內有a,不會再去查找GO里的a
預編譯不管if語句的,只要有變量聲明就要放入AO
js中無塊級作用域,即使用{}括起來,b也是聲明在函數test內部的局部變量,會被添加到執行環境
使用var聲明的變量會被自動添加到最接近的環境中
function test(){return a;a =1;function a(){};var a =2}
console.log(test())// f a(){}AO ={a:undefined → fa
}
function test(){a =1;function a(){};var a =2return a
}
console.log(test())// 2
function test(e){function e(){}console.log(e);// f e(){}arguments[0]=2;console.log(e);// 2if(a){var b =3}var c;console.log(a);// undefineda =4;var a;console.log(b);// undefinedf =5;console.log(c);// undefinedconsole.log(a);// 4}var a
test(1)
console.log(f);// 5GO ={a: undefined test: f test(e){...},f:5// 在執行test內函數值}// 執行test(1)時創建AO
AO ={e:undefined → 1 → f e(){} → 2 b: undefined → c: undefined → a: undefined → 4}
暗示全局變量
未用var 聲明的b就是暗示全局變量,是window的屬性之一
function test(){var a = b =1// 1. var a// 2. b = 1 (賦值,沒有在function內部聲明,是全局變量,存到window)// 3. a = b (賦值)}
練習
var a =false+1;
console.log(a)// 1 隱式類型轉換var b =false==1;
console.log(b)// false