2012-01-31 17 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'、BB '']


コードブロック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'、BB '']


コードブロック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']


'concat'メソッドは引数で 'aaa' var passを変更できないという問題がコードブロック3です。
'concat'、 'push'、およびdirect modifyの違いは何ですか?

答えて

2

コードブロック1と2では、aaの内容を変更しています。

コードブロック3に、あなたは別の配列にaaa再結合され、そして機能t1aaaはもう外aaへの参照はありませんが。したがって、外部はaaは変更されていません。

Is JavaScript a pass-by-reference or pass-by-value language?を参照すると、JavaScriptの変数受け渡し動作の詳細な説明が表示されます。

関連する問題