2014-01-16 49 views
1

下面是測試代碼:Javascript:形式參數和參數對象之間有什麼區別?

function fn(i, j) { 
    arguments = [3, 4]; 
    console.log(i, j); // 1, 2 
    console.log(arguments); // [3, 4] 
} 

fn(1, 2); 

的功能,我重置arguments對象

然而,爭論對象改變,但在不chaned傳遞的形式參數,我想他們是一樣的,那麼有什麼區別?

+0

'函數fn(I,J){ 參數[0] = 3; 參數[1] = 4; console.log(i,j); // 1,2現在是3,4 console.log(arguments); // [3,4] }' 'fn(1,2);' 使用參數對象的數組索引可以更改正式參數! –

+0

如果您對參數對象和局部變量如何協同工作更感興趣,我會向您推薦一個答案,我發佈了一個不同的問題,我試圖在代碼中編寫ECMA規範中編寫的內容([LINK]( http://stackoverflow.com/a/17478232/1258878))。簡而言之:它可以與getter和setter一起使用局部變量。這也應該表明,你不能忽略整個對象而不會失去這種行爲(就像其他人已經正確發佈)。 – basilikum

回答

2

arguments是一個類似數組的對象,它引用了傳遞給它的所有參數。在這裏,你只是重新分配arguments指向一些其他的對象。如果你想改變實際的參數,你必須改變的arguments的元素,像這樣

function fn(i, j) { 
    arguments[0] = -1; 
    console.log(i, j);  // -1, 2 
    console.log(arguments); // { '0': -1, '1': 2 } 
} 

fn(1, 2) 

arguments, MDN docs

arguments對象引用不是一個數組。它與Array類似,但 除長度外沒有任何數組屬性。例如,它沒有彈出方法 。

然而,它可以被轉換爲一個真正的數組:

變參= Array.prototype.slice.call(參數);

如果陣列泛型 是可用的,可以使用代替下列:

變參= Array.slice(參數);

0

您正在用新數組替換參數數組(實際上是一個類似數組的對象)。它們是獨立的對象並且並排存在。替換arguments變量的引用不會使該函數使用新數組作爲參數,它仍然具有對原始對象的內部引用。

如果更改arguments對象的內容,它將反映在函數參數:

function fn(i, j) { 
    arguments[0] = 3; 
    arguments[1] = 4; 
    console.log(i, j); // 3, 4 
    console.log(arguments); // [3, 4] 
} 

fn(1, 2); 
相關問題