天天看點

關于對javascript的局部變量以及全局變量作用域的追蹤

今天看了一段關于require.js的AMD規範中的shim的使用方式和實作原理,但開局講到javascript中對全局變量的定義方法,其方法有三種:

eg1: 直接利用var申明
var a="hello world1";
 function A(){
     alert(a);
 }
           
eg2: 不使用var,直接給定義變量,隐式的聲明了全局變量
b="hello world2"
function B(){
    alert(b);
}
           

這種方法,即使該變量是在一個function内,當該function被執行後它變成了全局變量 —- 但是function不執行它就不被其他function知道,是以最好定義在function外。

eg3:使用window.變量名定義為全局變量,但是注意:調用時候建議寫上window.變量名,當然也可以不寫;我們常用的document.getXXX的document對象就是window的
window.c="hello world3";
function C(){
    alert(window.c);
}
           
在涉及全局以及局部變量的作用域時,我看到這樣一片文章,代碼如下:
var a=;
function test(){
    a=;
    console.log(a);
    console.log(this.a);
    var a;
    console.log(a);
}
test();

output: ,,
           
注: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的值。
var a=;
function test(){
    console.log(a);
    var a=;
    console.log(a);
}
test();

output: undefined , 
           
注:看了第1個例子,可能有同學會認為輸出結果是10 10,但是結果卻不是10 10,為什麼呢?仔細看第1個例子解析的第一句話,Javascript在執行前會對整個腳本檔案的聲明部分做完整分析(包括局部變量),但是不能對變量定義做提前解析,在這個函數中,執行第3行前,可以認為已經聲明了變量a,但是并沒有定義(這裡即指派),是以第3行輸出結果為undefined,執行第4行a =10後,變量a的值就為10,是以第5行輸出結果為10。
var a=;
function test(){
    console.log(a);
    a=;
    console.log(a);
}
test();
console.log(a);

output: ,  ,
           
注:我們知道在函數内部,一般用var聲明的為局部變量,沒用var聲明的一般為全局變量,在test函數内,a=10聲明了一個全局變量,是以第3行的a應該輸出全局變量的值,而在函數執行之前已經聲明過一個全局變量并指派100,是以這裡第上輸出100。第4行給全局變量a 重新指派10,是以全局變量a的值變成10,是以第5行輸出10。而在函數test外部,第8行輸出全局變量a的值,因為全局變量被重新指派為10,是以輸出結果即為10。

轉: http://blog.csdn.net/longwenjunjie/article/details/48163293

繼續閱讀