2015-11-01 51 views
1
(function(spanishGreeting, name){ 
    var spanishGreeting = 'HOLA!!'; 
    spanishGreeting = 'Como estas!' 
    console.log(spanishGreeting); 
}(greeting,'John')); 

有人請向我解釋一下,如果我對上述代碼的理解是正確的嗎?內存變量名稱相同的位置

因此,首先在IIFE var spanishGreeting = 'HOLA!!';之內,這行代碼創建一個全新的變量,其名稱與傳遞給IIFE的參數名稱相同。那麼這個新的變量聲明會覆蓋作爲參數傳入的變量嗎?所以基本上傳入的變量spanishGreeting將在函數的其餘部分被忽略。

現在是參數變量spanishGreeting仍然存在於內存中嗎?或者有新的變量聲明:var spanishGreeting = 'HOLA!!';覆蓋了參數變量spanishGreeting的內存位置?

回答

2

現在是參數變量西班牙語仍然存在內存中?

是的,它仍然存在於內存中。此行:

var spanishGreeting = 'HOLA!!'; 

創建一個新的局部變量,以相同名稱遮蔽/隱藏參數。仍然可以通過arguments[0]訪問spanishGreeting參數。參數變量仍然存在 - 您只是隱藏了名稱,因此無法通過名稱訪問它。

而且,這條線:

spanishGreeting = 'Como estas!' 

只是分配一個新的值到前一行剛創建的局部變量。它根本不改變參數變量。

一般來說,你應該避免命名具有相同名稱的參數和局部變量,因爲它只會混淆讀取你的代碼的人。

那麼這個新的變量聲明會覆蓋作爲參數傳入的變量 嗎?

不是。新的變量聲明會覆蓋名稱,但不會替換參數變量本身。它仍然可以通過arguments[0]訪問。在Javascript中命名是分層的。最接近的範圍名稱首先解析 - 如果在那裏未找到,則Javascript會查找鏈中較高位置的鏈。局部變量是它看起來的第一個地方,然後是參數名稱,然後是下一個範圍內的變量等,最後是全局變量。

+0

非常感謝您的詳細解答!它清除了很多問題,我有哈哈...! – LP496