1.程序執行的前一刻會先將代碼預編譯一遍,如果有語法錯誤則直接終止程序運行
//預編譯之通天編譯 --> 在執行的前一刻,會把文件通天掃描一遍
/**
- //預編譯 函數整體提升(即函數會放到程序最頂端) 變量提升 (即 var a = 123 ; 難麼會將a變量提升,則值是undefined)
- 未先聲明變量就賦值的歸全局所有 即Windows ,在程序執行則會創建一個Go{ } 對象 = Window{ }
- 1.先創建一個AO對象
- 2.再將函數形參和變量存入AO對象中,初始爲undefined
- 3.在將相應參數值從執行順序往AO對象中傳值,後覆蓋前
- 4.最後在執行程序,然後在AO對象中找
*/
// console.log(b);//undefined
// var b = 234;
// function test(a){
// console.log(a)//fn
// console.log(b)//234
// var a = 123;
// console.log(a)//123
// function a(){}
// b = 123 ;
// console.log(b);//123
// }
// console.log(b);//234
// test(1);
// console.log(b);//123
2.函數作用域之精闢及函數原理的淺入深出
這裏我就拿個上面那個列子稍微改動一下
console.log(b);//undefined
var b = 234 ;
function test(a){
console.log(a) //fna
function a(){
a = 123456 ;
function c(){c = 789;}
}
console.log(b) //fnb
var a = 123 ;
console.log(a) ; //123
b();
function b(){
console.log(b) ;//undefined
c = 666 ;
var b = 456 ;
console.log(b) ;//456
}
console.log(c) ;//666
c = 999 ;
b = 123 ;
console.log(b);//123
}
test(1);
console.log(c); //999
console.log(b); //234