2012-01-31 26 views
0

請首先查看這3個代碼塊。修改node.js的外層參數var

碼塊1:

var t1 = function(aaa) { 
     setTimeout(function(){ 
     a = 'bb'; 
     aaa.push(a); 
    }, 1000); 

} 

var t3 = function() { 
    var aa = new Array; 
    aa[0] = 'aa'; 

    console.log(aa); 
    t1(aa); 

    setTimeout(function(){ 
     console.log(aa); 
    }, 3000); 
} 

t3(); 

輸出: [ 'AA'] [ 'AA', 'B-B']


碼塊2:

var t1 = function(aaa) { 
     setTimeout(function(){ 
     aaa[1] = 'bb'; 
    }, 1000); 

} 

var t3 = function() { 
    var aa = new Array; 
    aa[0] = 'aa'; 

    console.log(aa); 
    t1(aa); 

    setTimeout(function(){ 
     console.log(aa); 
    }, 3000); 
} 

t3(); 

輸出: [ 'AA'] [ 'AA', 'B-B']


代碼塊3:

var t1 = function(aaa) { 
     setTimeout(function(){ 
     aaa = aaa.concat('bb'); 
    }, 1000); 

} 

var t3 = function() { 
    var aa = new Array; 
    aa[0] = 'aa'; 

    console.log(aa); 
    t1(aa); 

    setTimeout(function(){ 
     console.log(aa); 
    }, 3000); 
} 

t3(); 

輸出: [' aa'] ['aa']


問題是代碼塊3'concat'方法無法通過參數修改'aaa'var pass。
'concat','push'和直接修改有什麼區別?

回答

2

在代碼塊1和2中,您正在修改aa的內容。

儘管在代碼塊3你是重新綁定aaa到另一陣列,並且在功能t1aaa是不向外部aa參考了。所以外部aa沒有被修改。

你可以參考Is JavaScript a pass-by-reference or pass-by-value language?來查看關於Javascript變量傳遞行爲的詳細解釋。