2017-05-07 68 views
1

當我設置arugments[0] = chewie; arguments[1] = luke它打印:的Javascript arguments對象無法正常運行

巴卡

巴卡

漢·索羅

巴卡

什麼我的預期是以下幾點:

巴卡

天行者盧克

漢·索羅

巴卡

function starWars(luke, darth, han, chewie) { 
 

 
    arguments[0] = chewie; 
 
    arguments[1] = luke; 
 

 
    document.write(arguments[0] + "<br>"); 
 
    document.write(arguments[1] + "<br>"); 
 
    document.write(arguments[2] + "<br>"); 
 
    document.write(arguments[3] + "<br>"); 
 
    
 
} 
 

 
starWars("Luke Skywalker", "Darth Vader", "Han Solo", "Chewbacca");

任何人都可以解釋我爲什麼在我預期它不工作的細節?

+1

你應該** **不被以'手動arguments'分配值。在幾乎所有情況下,不再需要在ES2015或更高版本中使用'arguments'對象 – naomik

+1

因爲'arguments [0]'和'luke'完全相同。不是兩個引用相同的值,但基本上都是**種類相同的變量**。如果你改變'arguments [0]','luke'也會改變;反之亦然。這麼多知識;沒有任何理由來解釋或甚至使用它。聆聽@naomik,儘可能避免使用'arguments'對象。 – Thomas

回答

3

在鬆散模式下,arguments中的條目是鏈接到指定的參數。因此,通過設置arguments[0],您可以設置luke.字面上,行arguments[0] = chewie;luke = chewie;是可以互換的。因此,稍後當您從luke使用arguments[1]時,您正在使用更新後的值(chewie)。

嚴格模式消除了這個神奇的鏈接:

"use strict"; 
 
function starWars(luke, darth, han, chewie) { 
 

 
    arguments[0] = chewie; 
 
    arguments[1] = luke; 
 

 
    console.log(arguments[0]); 
 
    console.log(arguments[1]); 
 
    console.log(arguments[2]); 
 
    console.log(arguments[3]); 
 
    
 
} 
 

 
starWars("Luke Skywalker", "Darth Vader", "Han Solo", "Chewbacca");

1

你重新分配與chewieluke變量,因爲argument[0]參考luke

所以在arguments[0] = chewie之後,會發生什麼是luke = chewie

一種解決方法可以是:

var tempLuke = argument[0]; 
arguments[0] = chewie; 
arguments[1] = tempLuke; 
1

當您更改arguments對象,你也改變了函數的參數變量,因爲它擁有的變量的引用。

總結

1)arguments[0] = chewie;

在這裏,你也設置可變luke到chewie( '巴卡')

2)參數[1] =盧克;

在這裏,盧克已經成爲'chewbacca'的第一步。所以,你正在作出論證dart也'chewbacca'。