2010-09-15 82 views
4

如果我有一個功能,例如:命名的Javascript功能參數VS參數對象

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打印出函數源代碼,而不是函數名。

回答

3

參數「數組」存在於任何函數上下文中,並枚舉當前上下文調用收到的參數。是的參數[0]是指給出的第一個參數,所以如果你將它標記爲「名稱」,它將是同樣的事情。

參數對於處理未定義數量的參數(即參數列表),元編程或者甚至在您想強加一些啓發式來確定哪些參數代表什麼樣的數據(即,您不相信實施者),但這是一個相當有限的用例。

我會強烈建議你避免依賴的參數陣列上有兩個原因:

1)。索引位置不是一個非常安全的機制,它依賴於這個數據實際上意味着你的想法,也不是一個處理變化的靈活機制。 2)。如果您放棄了命名參數,則會有效地銷燬信息。儘管JS函數簽名不像其他語言那樣嚴格,但它仍然是試圖理解你的函數實際工作的任何人的關鍵信息。 JS是一種真正表達的語言,確實是的事情。

這就是說,參數包含其他有趣的屬性,如「被調用者」,這將爲你提供一些相當大的力量來做不能完成的事情。這是值得調查自己(良好的起點here)。

還有一個更嚴重的問題,即參數本身處於一種奇怪的半贊成,半支持狀態,所以在使用它時需要進行x瀏覽器測試並註明以備將來考慮。

我知道沒有內部陷阱。

+0

將'arguments'自身作爲函數中的局部變量不被棄用。 – 2010-09-15 11:02:27

+0

謝謝,如果沒有正確調用,函數會顯示奇怪的行爲。我可以解決這個問題。我主要使用與.apply和arguments.callee函數結合使用的參數,所以使用它很重要。 – Raynos 2010-09-15 11:05:12

2

是,arguments[0]arg指向同樣的事情,改變一個人改變了其他。 ECMAScript 5(目前逐漸進入主流瀏覽器)略有改變:在嚴格模式下,命名參數與對象間的關聯較鬆,因爲arguments中的值只是命名參數的副本。從的ECMAScript 5的部分10.6:

對於嚴格模式的功能,參數對象的屬性的值是簡單地傳遞給功能的參數的副本,並有屬性值和之間沒有動態鏈接形式參數值。

+0

作爲開發人員應該如何提前思考並嘗試應對ECMAscript 5更改,或者只有在實現更改中發生更改時才修復它。 – Raynos 2010-09-15 11:07:20

+0

@Raynos - 永遠領先;)如果你知道它,那麼這絕對是你可以計劃的一個問題。 – annakata 2010-09-15 11:39:19