局部變量與全局變量
1、程序的運行結果為:100 10 100
1 var a = 10; 2 function test(){ 3 a = 100; 4 console.log(a); 5 console.log(this.a); 6 var a; 7 console.log(a); 8 } 9 test();
解析:Javascript在執行前會對整個腳本文件的聲明部分做完整分析(包括局部變量),從而確定變量的作用域,所以在函數test執行前,由於第6行聲明了局部變量a,所以函數內部的a都指向已經聲明的局部變量,所以第4行輸出100。第5行輸出this.a,我們都知道,函數內部的this指針指向的是函數的調用者,在這裏函數test被全局對象調用,所以this指針指向全局對象(這裏即window),所以this.a = window.a,一開始生命了全局變量a=10,所以第5行輸出結果為10。第7行輸出結果為100,因為局部變量a在第3行已經被賦值了100,所以直接輸出局部變量a的值。
2、程序的運行結果為:undefined 10
1 var a = 100; 2 function test(){ 3 console.log(a); 4 var a = 10; 5 console.log(a); 6 } 7 test();
解析:看了第1個例子,可能有同學會認為輸出結果是10 10,但是結果卻不是10 10,為什麽呢?仔細看第1個例子解析的第一句話,Javascript在執行前會對整個腳本文件的聲明部分做完整分析(包括局部變量),但是不能對變量定義做提前解析,在這個函數中,執行第3行前,可以認為已經聲明了變量a,但是並沒有定義(這裏即賦值),所以第3行輸出結果為undefined,執行第4行a =10後,變量a的值就為10,所以第5行輸出結果為10。
3、程序的運行結果為:100 10 10
1 var a = 100; 2 function test(){ 3 console.log(a); 4 a = 10; 5 console.log(a); 6 } 7 test(); 8 console.log(a);
解析:我們知道在函數內部,一般用var聲明的為局部變量,沒用var聲明的一般為全局變量,在test函數內,a=10聲明了一個全局變量,所以第3行的a應該輸出全局變量的值,而在函數執行之前已經聲明過一個全局變量並賦值100,所以這裏第上輸出100。第4行給全局變量a 重新賦值10,所以全局變量a的值變成10,所以第5行輸出10。而在函數test外部,第8行輸出全局變量a的值,因為全局變量被重新賦值為10,所以輸出結果即為10
局部變量與全局變量