熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

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

2013-11-15 12:01:31  來源: JSP教程 

  對於“JavaScript 函數參數是傳值(byVal)還是傳址(byRef)”這個問題普遍存在一個誤區numberstring等“簡單類型”是傳值Number String Object Array等“復雜類型”是傳址
這樣不對嗎?為什麼會有這樣的誤區?看一下這兩段代碼

復制代碼 代碼如下:
//造成傳值假象的代碼
function modifyLikeByVal(x){
  x = ;
  consolelog(x = %d x);
}
var x = ;
consolelog(x = %d x); // 輸出 x =
modifyLikeByVal(x);  // 輸出 x =
consolelog(x = %d x); // 輸出 x =    x沒變! 復制代碼 代碼如下:
//造成傳址假象的代碼
function modifyLikeByRef(x){
  x[] = ;
  x[] = ;
  x[] = ;
  consolelog(x = [ %s ] xjoin( ));
}
var x = [ ];
consolelog(x = [ %s ] xjoin( )); // 輸出 x = [ ]
modifyLikeByRef(x);  // 輸出 x = [ ]
consolelog(x = [ %s ] xjoin( )); // 輸出 x = [ ]   x變了!

  
於是由以上代碼得出結論“簡單類型”作為參數是傳值(byVal)的“復雜類型”作為參數是傳址(byRef)的

  問題出在哪呢?

  仔細觀察兩個函數就可以發現一點
在byVal中是直接修改了參數x x = ;
而byRef中是修改參數x的成員 x[] = ; x[] = ; x[] = ;

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

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

  在“byVal”中

復制代碼 代碼如下:
global {  // 表示全局作用域下面的表示函數作用域
  var x = ;  // 初始化指針x並指向數字
    fun(x) {
      x = globalx; // 傳入參數globalx; fun域的x指針地址與global域的x指針地址一樣指向數字
      x = ; // 修改fun域的x指針地址指向數字
    } // fun 域結束global域中的x指針沒改變
}

  
在“byRef”中

復制代碼 代碼如下:
global {  // 表示全局作用域下面的表示函數作用域
  /*
    初始化指針x並指向數組[ ]
    其實是x的三個成員 分別指向
  */
  var x = [ ]; 
    fun(x) {
      x = globalx; // 傳入參數globalx; fun域的x指針地址與global域的x指針地址一樣指向數組[ ]
      /*
       在fun域中的x沒有再被改變
       緊接著修改fun域中的x(也就是globalx)三個成員指針的指向
      */
      x[] = ;
      x[] = ;
      x[] = ;
    } // fun 域結束global域中的x指針沒改變但其三個成員指針被改變了於是就看到我們輸出的結果
}

  
那這段代碼怎麼解釋呢???

復制代碼 代碼如下:
(function(a b){
    arguments[] = ;
    b = ;
    consolelog(arguments a b);
})( );

  
只能說a b是arguments[][n]的別名了

  如果有不對的地方請指出來謝謝

  如果有更好的解釋歡迎大家分享


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20108.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.