var rain = 1; function rainman(){ var man = 2; funciton inner(){ var innerVar = 4; alert(rain); } inner(); } rainman();
在alert(rain);這句代碼,JavaScript首先在inner函數中檢查,不然則在rainman中查找,這段代碼在rainmain()中沒有定義,則最終查找的是全局變量中的rain。函數
做用域鏈:JavaScript須要查找一個變量時,首先查找做用域鏈第一個對象,若是第一個對象沒有定義,則順序向後查找。spa
var rain = 1; function check(){ var rain = 100; alert(rain); } check(); //100 alert(rain); //1
function rainmain(){ //rainman 函數體內存在三個局部變量 i j k var i = 0; if(1){ var j = 0; for(var k=0;k<3;k++) alert(k); //0,1,2 alert(k); // 3 } alert(j); //0 }
i,j,k的做用域是相同的,他們在rainmain中是全局的code
function rain(){ var x = 1; function man(){ x = 100; } man(); //調用man alert(x); //這裏會彈出100 } rain(); //調用rain
上面代碼說明,變量x在整個rain體內均可以使用,並能夠從新幅值。可是會有如下狀況產生:對象
var x = 1; function rain(){ alert(x); //undefined var x = '3'; alert(x); //3 }
是因爲rain定義了x,它會隱藏同名全局變量x。因爲alert時還未定義,因此undefinedip
function rain(){ x = 100; } rain(); alert(x); //100
var x = 100; alert(window.x); //100