[英]How the parameters affect the variable values in a function?
我目前正在研究 JavaScript 並且我對 function 參數有疑問。 我有這個 function:
//Function 1 let from = 'Ann'; function showMessage(from, text) { from = 'Jane'; alert(from + ' says ' + text); } showMessage(from, 'Hello'); alert(from); //Function 2 let userName = 'John'; function showMessage1(){ userName = 'Bob' alert('Hello '+ userName); } alert(userName); showMessage1(); alert(userName);
我可以理解在 Function1 showMessage(from, 'Hello');
顯示Jane says Hello
並且alert(from)
顯示Ann
,因為當我傳遞 arguments 時,function 會創建我傳遞的值的本地副本。 我讀過,當你有一個同名的全局和局部變量時,局部陰影是全局的,我認為它發生在 Function1 中,這就是我在最后一行得到“Ann”的原因。
然后,由於我沒有將任何參數傳遞給 Function2,因此它不會創建本地副本,這就是為什么userName
的值等於Bob
並顯示在最后一行的原因。
編輯:我改寫我的問題:如果我看到的唯一區別是一個傳遞參數而另一個不傳遞參數,為什么它們的行為不同(一個不覆蓋全局變量而另一個覆蓋)?
這是因為您沒有在showMessage1
中聲明局部變量userName
。 變量是用關鍵字var
、 let
或const
之一聲明的(我不會 go 在這里討論差異,盡管它們很重要)。 如果你這樣做了,那么你會得到預期的結果:
//Function 1 let from = 'Ann'; function showMessage(from, text) { from = 'Jane'; alert(from + ' says ' + text); } showMessage(from, 'Hello'); alert(from); //Function 2 let userName = 'John'; function showMessage1(){ let userName = 'Bob' alert('Hello '+ userName); } alert(userName); showMessage1(); alert(userName);
在您的代碼段中,因為在分配userName = 'Bob'
之前沒有let
(或var
或const
),所以沒有名為userName
的局部變量要分配,因此它分配給封閉 scope 中的userName
變量 - 這里是全球 scope。 這就是為什么在您的示例中,全局userName
被覆蓋,但它不在上面的版本中。
編輯:我改寫我的問題:如果我看到的唯一區別是一個傳遞參數而另一個不傳遞參數,為什么它們的行為不同(一個不覆蓋全局變量而另一個覆蓋)?
明確回答這個問題:區別與是否傳遞參數無關。 區別在於 function 內部的賦值是局部變量還是非局部(在本例中為全局)變量。 在您的showMessage
中,分配是 to from
,根據定義,它是一個局部變量,因為它是一個 function 參數。 在您原來的showMessage1
中,對userName
的分配是對來自封閉(全局)scope 的非局部變量,因為在函數的 scope 中沒有聲明userName
。 通過用let
(或var
或const
)聲明變量,在 function 中創建了一個同名的局部變量,然后將其分配給而不影響封閉 scope 中的同名(“陰影”)變量。
一個非常簡略的規則集是 JS 不會在“byValue”和“byReference”之間做出決定。 至少不像其他編程語言那樣做。 原始類型的所有內容都由 Value 傳遞(字符串 bools 和 numbers 等)。 復合變量,例如 OBJECTS 和 ARRAYS 通過引用傳遞。 就是這樣。 沒有關鍵字可以告訴您采取不同的行動。 如果您想按值放置一個數組或 Object,然后創建它的副本。 如果您想通過引用獲得原始類型 - 創建原始類型的 object。 類型較少的語言,如 Javascript 或 REXX,而其他一些語言則處理不同的事情,例如依賴編譯器的語言。 編譯器必須確切地知道要做什么。 在腳本語言中,我們有一個很好的解釋器,他可以在最后一秒決定什么是對的,什么是錯的。 :).oO(有時這樣做會造成一些白發;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.