簡體   English   中英

JavaScript命名函數參數與參數對象

[英]Javascript named function parameters vs arguments object

如果我有這樣的功能:

function doStuff(arg) {
   arguments[0] = "4" + arg;
   console.log(arg);
   console.log.apply(null, arguments);
}

顯然, doStuff("name")打印兩次“ 4name”。

argarguments[0]指向同一事物? 我可以互換使用嗎? javascript是否在做我應該注意的內部任何事情,並且有任何陷阱嗎?

我知道參數處理所有傳遞的參數,而不僅僅是命名參數。 我只關心它如何處理第一個(或第n個)參數。

[編輯]

我實際上是用這個

function name(arg) {
   arguments[1] = args;
   arguments[0] = "[INFO] " + args.callee + " arg: %o";
   console.log.apply(this, arguments);
}

並在函數本身中調用name(arguments) 有趣的是args.callee打印出函數源代碼,而不是函數名稱。

參數“數組”存在於任何函數上下文中,並枚舉當前上下文調用接收到的參數。 是arguments [0]引用給定的第一個參數,因此,如果將其標記為“ name”,則將是相同的。

參數對於處理不確定數量的參數(例如,參數列表),元編程,甚至在您想要施加啟發式以確定哪些參數表示哪種數據(即您不信任實現者)的地方,功能都很強大,但是至少可以說,這是一個相當有限的用例。

我強烈建議您避免依賴arguments數組,原因有兩個:

1)。 索引位置並不是依賴於此數據(實際上意味着您所認為的事實)的非常安全的機制,也不是用於處理更改的靈活機制。

2)。 如果刪除命名參數,則實際上是在破壞信息。 盡管JS函數簽名不像其他語言那樣嚴格,但是對於任何試圖了解您的函數實際功能的人來說,它仍然是至關重要的信息。 JS是一種表達真正重要的語言。

也就是說,參數還包含其他有趣的屬性,例如“被調用者”,這些屬性將為您提供執行其他無法完成的任務的強大功能。 值得研究一下自己( 這里是一個很好的起點)。

還有一個更嚴重的問題是,參數本身處於一種奇怪的半棄用,半支持狀態,因此,在使用它的地方確實需要進行x瀏覽器測試,並注明出來以供將來考慮。

沒有我知道的內部陷阱。

是的,您可以互換使用它們。

這是有關如何使用arguments的很好的文檔: https : //developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments

是的, arguments[0]arg指向同一事物,而更改一個將更改另一個。 ECMAScript 5(當前逐漸進入主流瀏覽器)對內容進行了細微更改:在嚴格模式下,命名參數與arguments對象之間的關聯更為寬松,因為arguments中的值只是命名參數的副本。 從ECMAScript 5的10.6節開始:

對於嚴格模式函數,arguments對象的屬性值只是傳遞給該函數的參數的副本,並且屬性值和形式參數值之間沒有動態鏈接。

暫無
暫無

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

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