簡體   English   中英

js 全局和本地 scope

[英]js global and local scope

我正在對范圍進行一些實驗,但偶然發現了這個我不明白的東西。

 var GV = 'global_var' function changeVar(lv) { console.log('inside function lv is '+lv); lv='local_var' console.log('after changing value lv is '+lv); console.log('inside function GV is '+GV); } console.log('before function GV is '+GV); changeVar(GV); console.log('after function GV is '+GV);

如果我在 lv 的 scope 上方運行代碼是本地的,並且任何修改都不會更改全局 scope 中的 GV,但是如果我將 GV 更改為數組並修改其在同一 ZC1C425268E68385D1AB507 中的一個元素,那么也發生變化。 這是為什么? 我有一種感覺,它可能與實例有關,但我不明白。

 var GV = [1,5,8] function changeVar(lv) { console.log('inside function lv is '+lv); lv[1]=[0] console.log('after changing value lv is '+lv); console.log('inside function GV is '+GV); } console.log('before function GV '+GV); changeVar(GV); console.log('after function GV is '+GV);

我考慮過提升(所以如果 ls 在 function 中聲明為新變量),但如果是因為這樣,那么 function 中的第一個 console.log 不應該顯示未定義嗎?

這是因為當var GV = 'global_var'時,GV 變量包含實際的字符串 'global_var'。 當您將 GV 傳遞給changeVar時,它是按值傳遞的,即在 changeVar function 的changeVar內部,會創建一個新變量lv ,並將值“global_var”復制到新的新變量中。 在調用 function 之后,這是 state:

GV 仍然包含“global_var”,而 lv 包含“global_var”的副本,完全相同的值。

現在在本地 scope 內部, lv='local_var'和 lv 已更新,但 GV 保持不變。 因此,在您退出 function 后,GV 保持不變,因為它位於完全不同的 memory 位置。

現在讓我們看看第二種情況,其中GV = [1,5,8] 在這種情況下,GV 被分配了一個 JavaScript 數組,記住,arrays 是對象。 對象有引用,因此 GV 變量包含對 [1, 5, 8] 數組的引用。 現在,一旦您調用 function changeVar並傳入 GV 作為參數,數組的引用就會被傳遞並存儲在lv中。 現在在 function 調用之后,這是 state:

GV 包含對 [1, 5, 8] 的引用,而 lv 也包含對 [1, 5, 8] 的相同引用。 所以它是傳值引用,即引用傳遞,而不是整個數組作為副本傳遞給function。 在 function 內部,當你執行lv[1]=[0]時,它會將 memory 中的原始數組更新為 [1, 0, 8]。

當您退出 function 時,GV 仍然指向原始數組,當您打印 GV 時,它會顯示更新后的數組 [1, 0, 8]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM