亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript 函數(shù)參數(shù)是傳值(byVal)還是傳址(byRef) 分享

 更新時(shí)間:2013年07月02日 15:08:08   作者:  
這篇文章主要介紹了在JS中函數(shù)參數(shù)是傳值(byVal)還是傳址(byRef)的誤區(qū)我們通過(guò)實(shí)例說(shuō)明一下,有需要的朋友可以參考

對(duì)于“JavaScript 函數(shù)參數(shù)是傳值(byVal)還是傳址(byRef)”這個(gè)問(wèn)題,普遍存在一個(gè)誤區(qū):number,string等“簡(jiǎn)單類(lèi)型”是傳值,Number, String, Object, Array等“復(fù)雜類(lèi)型”是傳址。
這樣不對(duì)嗎?為什么會(huì)有這樣的誤區(qū)?看一下這兩段代碼:

復(fù)制代碼 代碼如下:

//造成傳值假象的代碼
function modifyLikeByVal(x){
  x = 1;
  console.log('x = %d', x);
}
var x = 0;
console.log('x = %d', x); // 輸出 x = 0
modifyLikeByVal(x);  // 輸出 x = 1
console.log('x = %d', x); // 輸出 x = 0   x沒(méi)變!

復(fù)制代碼 代碼如下:

//造成傳址假象的代碼
function modifyLikeByRef(x){
  x[0] = 4;
  x[1] = 5;
  x[2] = 6;
  console.log('x = [ %s ]', x.join(', '));
}
var x = [1, 2, 3];
console.log('x = [ %s ]', x.join(', ')); // 輸出 x = [ 1, 2, 3 ]
modifyLikeByRef(x);  // 輸出 x = [ 4, 5, 6 ]
console.log('x = [ %s ]', x.join(', ')); // 輸出 x = [ 4, 5, 6 ]   x變了!

于是,由以上代碼得出結(jié)論,“簡(jiǎn)單類(lèi)型”作為參數(shù)是傳值(byVal)的,“復(fù)雜類(lèi)型”作為參數(shù)是傳址(byRef)的。

問(wèn)題出在哪呢?

仔細(xì)觀(guān)察兩個(gè)函數(shù),就可以發(fā)現(xiàn)一點(diǎn):
在byVal中,是直接修改了參數(shù)x: x = 1;
而byRef中,是修改參數(shù)x的成員: x[0] = 4; x[1] = 5; x[2] = 6;

本人由此得出猜想:在JavaScript中,所有的變量或成員,都是一個(gè)指針,在修改變量或成員值的時(shí)候,其實(shí)是修改了該指針的地址。

這樣上面的代碼就可以得到解釋了:

在“byVal”中:

復(fù)制代碼 代碼如下:

global {  // 表示全局作用域,下面的表示函數(shù)作用域
  var x = 0;  // 初始化指針x并指向數(shù)字0
    fun(x) {
      x = global.x; // 傳入?yún)?shù)global.x; fun域的x指針地址與global域的x指針地址一樣指向數(shù)字0
      x = 1; // 修改fun域的x指針地址,指向數(shù)字1;
    } // fun 域結(jié)束,global域中的x指針沒(méi)改變
}

在“byRef”中:
復(fù)制代碼 代碼如下:

global {  // 表示全局作用域,下面的表示函數(shù)作用域
  /*
    初始化指針x并指向數(shù)組[1, 2, 3]
    其實(shí)是x的三個(gè)成員0, 1, 2,分別指向1, 2, 3;
  */
  var x = [1, 2, 3]; 
    fun(x) {
      x = global.x; // 傳入?yún)?shù)global.x; fun域的x指針地址與global域的x指針地址一樣指向數(shù)組[1, 2, 3]
      /*
       在fun域中的x沒(méi)有再被改變
       緊接著修改fun域中的x(也就是global.x)三個(gè)成員指針的指向
      */
      x[0] = 4;
      x[1] = 5;
      x[2] = 6;
    } // fun 域結(jié)束,global域中的x指針沒(méi)改變,但其三個(gè)成員指針被改變了,于是就看到我們輸出的結(jié)果
}

那這段代碼怎么解釋呢???
復(fù)制代碼 代碼如下:

(function(a, b){
    arguments[0] = 1;
    b = 2;
    console.log(arguments, a, b);
})(-1, -2);

只能說(shuō)a, b...,是arguments[0],...[n]的別名了。

如果有不對(duì)的地方,請(qǐng)指出來(lái),謝謝。

如果有更好的解釋?zhuān)瑲g迎大家分享。

相關(guān)文章

最新評(píng)論