簡體   English   中英

參數如何影響 function 中的變量值?

[英]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 變量是用關鍵字varletconst之一聲明的(我不會 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 (或varconst ),所以沒有名為userName的局部變量要分配,因此它分配給封閉 scope 中的userName變量 - 這里是全球 scope。 這就是為什么在您的示例中,全局userName被覆蓋,但它不在上面的版本中。

編輯:我改寫我的問題:如果我看到的唯一區別是一個傳遞參數而另一個不傳遞參數,為什么它們的行為不同(一個不覆蓋全局變量而另一個覆蓋)?

明確回答這個問題:區別與是否傳遞參數無關。 區別在於 function 內部的賦值是局部變量還是非局部(在本例中為全局)變量。 在您的showMessage中,分配是 to from ,根據定義,它是一個局部變量,因為它是一個 function 參數。 在您原來的showMessage1中,對userName的分配是對來自封閉(全局)scope 的非局部變量,因為在函數的 scope 中沒有聲明userName 通過用let (或varconst )聲明變量,在 function 中創建了一個同名的局部變量,然后將其分配給而不影響封閉 scope 中的同名(“陰影”)變量。

一個非常簡略的規則集是 JS 不會在“byValue”和“byReference”之間做出決定。 至少不像其他編程語言那樣做。 原始類型的所有內容都由 Value 傳遞(字符串 bools 和 numbers 等)。 復合變量,例如 OBJECTS 和 ARRAYS 通過引用傳遞。 就是這樣。 沒有關鍵字可以告訴您采取不同的行動。 如果您想按值放置一個數組或 Object,然后創建它的副本。 如果您想通過引用獲得原始類型 - 創建原始類型的 object。 類型較少的語言,如 Javascript 或 REXX,而其他一些語言則處理不同的事情,例如依賴編譯器的語言。 編譯器必須確切地知道要做什么。 在腳本語言中,我們有一個很好的解釋器,他可以在最后一秒決定什么是對的,什么是錯的。 :).oO(有時這樣做會造成一些白發;)

暫無
暫無

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

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