[英]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.