代碼(1)?<script?type="text/javascript"?language="javascript">?
var?rain?=?1;?
function?rainman(){?
var?man?=?2;?
function?inner(){?
var?innerVar?=?4;?
alert(rain);?
}?
inner();?//調用inner函數?
}?
rainman();?//調用rainman函數?
</script>第一個代碼是很容易理解的觀察alert(rain);這句代碼。JavaScript首先在inner函數中查找是否定義了變量rain,如果定義了則使用inner函數中的rain變量;如果inner函數中沒有定義rain變量,JavaScript則會繼續(xù)在rainman函數中查找是否定義了rain變量,在這段代碼中rainman函數體內沒有定義rain變量,則JavaScript引擎會繼續(xù)向上(全局對象)查找是否定義了rain;在全局對象中我們定義了rain?=?1,因此最終結果會彈出'1'。?作用域鏈:JavaScript需要查詢一個變量x時,首先會查找作用域鏈的第一個對象,如果以第一個對象沒有定義x變量,JavaScript會繼續(xù)查找有沒有定義x變量,如果第二個對象沒有定義則會繼續(xù)查找,以此類推。?上面的代碼涉及到了三個作用域鏈對象,依次是:inner、rainman、window。?緊接著第二個問題來了JavaScript沒有塊級作用域。?這一點也是JavaScript相比其它語言較靈活的部分。?仔細觀察下面的代碼,你會發(fā)現變量i、j、k作用域是相同的,他們在整個rain函數體內都是全局的。?看到這里也是很好理解的,可是調用rainman()的下面我又創(chuàng)建了一個函數function()?fn1{alert(j)}?為什么不能調用了??第一個代碼證明他會沿著作用域鏈去找一直到window對象。為什么ijk在rainman中管用,我在創(chuàng)建一個函數就不管用了??<script?type="text/javascript"?language="javascript">?
function?rainman(){?
/**?
*?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?
}?
rainman()
funtion?fn1(){alert(j)}???//這里表示很疑惑!
fn1()
</script>第三個問題有點白癡如下代碼?x=100?等于全局函數改變可以改變相同命名的var?x這不奇怪。但是如果我把下面的x=100改成var?x=100呢?還有為什么我在調用rain()的位置下面輸入man(),會無效?只能在rain中運行這是為什么?<script?type="text/javascript"?language="javascript">?
function?rain(){?
var?x?=?1;?
function?man(){?
x?=?100;?
}?
man();?//調用man?
alert(?x?);?//這里會彈出?100?
}?
rain();?//調用rain?
</script>第四個問題簡單明了?下面的代碼為什么會是這個輸出結果。道理我是知道的預解析先找var?function?參數。然后執(zhí)行代碼?function內第一行的相當于var?x;然后alert(x)當然是undifined。但是自從學了作用域鏈以后總感覺他會想上去找這個X或者去找下面的那個X。在或者JS有變量提升的特性自動把var擠上面去。為什么沒有?如果不弄得明明白白清清楚楚以后難免會犯錯<script?type="text/javascript"?language="javascript">?
var?x?=?1;?
function?rain(){?
alert(?x?);?//彈出?'undefined',而不是1?
var?x?=?'rain-man';?
alert(?x?);?//彈出?'rain-man'?
}?
rain()?
</script>
JS作用域的幾個問題匯總求解答
幻滅丶
2016-06-25 10:45:57