2015-03-02 106 views
8

考慮這個JavaScript函數:參數和參考

var f = function (a) { 
    console.log(a+" "+arguments[0]); 
    a = 3; 
    console.log(a+" "+arguments[0]); 
} 

我預計aarguments[0]參考相同的值只到函數的第二個聲明。相反,他們似乎始終是指相同的值:f(2)導致

2 2 
3 3 

f({foo: 'bar'})原因:

[object Object] [object Object] 
3 3 

是參數標識符和arguments標識符以特殊的方式聯繫?

+1

是的,這是一個不好的事情,我認爲這會無論如何改變。 – 2015-03-02 16:44:54

+0

這是一個重複我想,我敢肯定,這是引用somewhere..I'll嘗試和挖掘出來的 – Liam 2015-03-02 16:46:05

+0

可能重複[是JavaScript的一個傳遞引用或傳址值語言?](HTTP ://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language) – Liam 2015-03-02 16:48:00

回答

7

是參數標識符和以特殊的方式連接的參數標識?

是(但只能在非嚴格模式)。

從規範(ES6ES5):

對於非嚴格模式功能的arguments對象的整數索引的數據的屬性,其數字名稱值小於相應的功能的形式參數的數目對象最初與功能的execution context中的相應參數綁定共享它們的值。 這意味着更改屬性將更改參數綁定的相應值,反之亦然。如果這樣的屬性被刪除,然後重新定義或者屬性更改爲訪問者屬性,則此對應關係被破壞。對於嚴格模式函數,參數對象的屬性值只是傳遞給函數的參數的副本,並且屬性值和形式參數值之間不存在動態鏈接。