解析變數的作用域
阿新 • • 發佈:2018-12-21
首先看程式碼
function test(a) {
console.log(a);
var a = 5;
function a() {}
console.log(b);
var b = 10;
console.log(b);
function b() {}
console.log(a)
var b = function() {};
console.log(b);
}
test(1)
首先把5次輸出結果分別打印出來方便大家看:
- function a() 函式a的函式體
- function b() 函式b的函式體
- 10 數字 10
- 5 數字 5
- function b(); 函式b的函式體
程式碼在執行之前系統會預編譯 (預處理)操作;
1.建立GO物件
2.查詢變數宣告(帶有var關鍵字) 並且將其賦值為undefined
GO{
a:undefined;
b:undefined;
}
3.查詢函式宣告( function 名字(){ } )把名字提出來,並且把函式體賦值給改名字
GO{
a:function a(){};
b:function b(){};
}
//執行程式碼
第一次輸出 console.log( a );
預編譯之後 第二步全域性變數a賦值為undefined,第三步函式 a 賦值為 function a(){}
變數名字一樣的情況下,後面的值會覆蓋前面的值。 所以是function a() {}
第二次輸出 console.log(b)
如同第一次步驟一樣;後面的值覆蓋前面的值 結果是function b(){};
第三次輸出 console.log(b)
var b=10;全域性變數b 賦值為10; 覆蓋了編譯時侯的值 結果是 10
第四次輸出 console.log( a )
var a=5; 覆蓋了變異時候a的值 結果是5
第五次 輸出 console.log(b);
var b = function() {} 覆蓋了之前var b=10;b的值; 結果是 function b(){};
這是在變數名和函式名字相同的情況下出現的。如果不一樣就沒有這些步驟。