1. 程式人生 > >解析變數的作用域

解析變數的作用域

首先看程式碼

			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次輸出結果分別打印出來方便大家看:

  1. function a() 函式a的函式體
  2. function b() 函式b的函式體
  3. 10 數字 10
  4. 5 數字 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(){};
這是在變數名和函式名字相同的情況下出現的。如果不一樣就沒有這些步驟。