一、前言
ECMA中所有函數的參數都是按照值傳遞。
二、基本數據類型
在向函數傳遞基本數據類型的時候,被傳遞的值會被復制給一個局部變量(arguments對象的一個元素)。
<pre>
<code>
function test( x ) {
x = 10; //第一次賦值
console.log( 'x1 : ' + x );
console.log( 'arguments1 : ' + arguments )
console.log( 'arguments[0]1 : ' + arguments[0] )
arguments[0] = 100;
console.log( 'x2 : ' + x );
console.log( 'arguments2 : ' + arguments )
console.log( 'arguments[0]2 : ' + arguments[0] )
};
test(5);
</code>
</pre>
<pre>
<code>
function test( num ) {
num = num + 10;
return num;
};
var num = 20;
var result = test( num );
console.log( 'num : ' + num );
console.log( 'result : ' + result );
</code>
</pre>
三、引用數據類型
在向函數傳遞引用數據類型的時候,會把這個值的內存地址復制給一個局部變量。所以局部變量的變化會反映到函數外部。
<pre>
<code>
function setName( obj ) {
obj.name = '盧林';
};
var lou = new Object();
window.setName( lou );
console.log( lou.name );
function setName( obj ) {
obj.name = '盧林';
//重新new
obj = new Object();
obj.name = 'others'; //其實已經不是傳入的內存地址
};
var lou = new Object();
window.setName( lou );
console.log( lou.name );
</code>
</pre>
其實原理很簡單,引用類型傳入的是內存地址的值(當然JavaScript操作內存地址),比如是8bit,內存地址是:1100 1010,指向的內容是person對象。所以你修改了name屬性會影響到函數外部。
原文鏈接:<a >http://blog.51yuekan.com/2014/11/24/2014-08-02-javascript-arguments/</a>