我今天一些審查,當我遇到以下約定:關於這個JavaScript的背景是怎麼回事?
TestParam(1);
function TestParam(p){
var p = p + 1;
alert(p); // alerts '2'
}
現在,很明顯,開發商不是故意要在函數內delcare「P」,而不是也許意味着:
p = p + 1;
但代碼仍然工作,即驚動了值爲「2」。所以它讓我思考。在以下情況下會發生什麼情況:
var a = 1;
TestParam(a);
alert(a); // alerts "1"
function TestParam(p){
var p = p + 1;
alert(p); // alerts '2'
}
再次提醒是我懷疑的(如上面評論中的暗示)。於是我很好奇會發生什麼,如果我用了一個對象:
var a = { b: 1 };
TestParam(a);
alert(a.b); //alerts 1
function TestParam(p) {
var p = {b:p.b + 1};
alert(p.b); //alerts 2
}
所以,在這種情況下,JavaScript有「記住」變量a
,即使它被傳遞給TestParam爲p
不過,p
被重新宣佈。
現在,如果我已經完成了函數內以下,那麼這兩個警報會一直「2」
p.b++;
//var p = {b:p.b + 1};
即它會修改原始對象的成員b
。我明白了。它以前的場景讓我感到困惑!
我意識到這是一個相當假設的問題,它不太可能帶來很多現實世界的用處,但它仍然讓我非常好奇,至於背景中發生了什麼,JavaScript究竟是如何確定範圍並引用它們變量。
有什麼想法?
您確定您對提示(p.a)的最後一個示例是正確的嗎?試圖分析這個,給了我一個想法,傳遞給TesParam的p對象在其中沒有「a」成員。 TestParam內部的警報會給你undefined! – nemisj
對不起 - 錯字 - 與單個字母混淆。也許我應該使用有意義的名稱:-)更正 –