2012-02-27 10 views
1
行うための正しい方法は何

...マイナーな構文の傷を参照することにより、グローバル変数を渡すと、4から別に参照される変数

var array1 = [] 
var array2 = [] 

function doIt(arg){ 
    var myArray; 

    if(arg == 1){ 
     myArray = array1 
    }else if(arg == 2){ 
     myArray = array2 
    } 

    myArray.push('test'); 

} 

doIt(1); //array1 should now be ['test'] but it's empty 
+0

"それは空です"と正確にはどういう意味ですか?いくつかのセミコロンがありません。 – bernie

+0

@AdamBernier:JavaScriptは、プログラマーの人生を楽にするために役立つ自動セミコロンを挿入しませんか?また、 "空"の場合、OPは 'array1'に要素が含まれていないことを意味します(' myArray = array'は配列の* copy *を作るためです)。 –

+0

@Kerrek SB:あなたはおそらく正しいでしょう。一部の開発環境ではセミコロンを自動挿入する可能性があります。あなたの2番目の点について:配列はオブジェクトであり、参照渡しです。 – bernie

答えて

2

を変更し、あなたのコードはOKです:http://jsfiddle.net/hk9Md/

var array1 = []; // <-- added semi-colon 
var array2 = []; // <-- added semi-colon 

function doIt(arg){ 
    var myArray; 

    if (arg == 1) { 
     myArray = array1; // <-- added semi-colon 
    } else if (arg == 2) { 
     myArray = array2; // <-- added semi-colon 
    } 
    myArray.push('test'); 
} 
doIt(1); 
alert(array1[0]); // produces 'test' 
+1

「欠落している」セミコロンはすべてオプションです。私はスタイルの問題としてそれらを含めることを好むが、この特定のコードは、それらの有無にかかわらず全く同じように動作します。(私は、セミコロンが含まれているケースはありますが、これはそうではないことを認識しています) – nnnnnn

+0

@nnnnnn:これは面白い動作です。ありがとうございます。 Kerrek SBに感謝します。 – bernie

+1

私のコードが 'arg'に間違った値を渡していることが判明し、それが問題でした。私はこれがとにかく誰かに役立つことを願っています。 – ofko

0

なぜない:

var myArray = arg == 1? array1 : array2; 

2つ以上の選択肢がある場合は、

var source = { 
    '1': array1, 
    '2': array2, 
    '3': array3, 
    ... 
} 

またはゼロインデックス:

次いで
var source = [ ,array1, array2, array3, ...]; 

function doIt(arg) { 
    var myArray = source[arg]; 
    ... 
} 

あるいは:

var doIt = (function() { 
    var source = { 
    '1': array1, 
    '2': array2, 
    '3': array3, 
    ... 
    } 
    return function (arg) { 
    var myArray = source[arg]; 
    } 
}()); 

ヤーブーツを埋めます。 :-)

+0

OK、それは問題にあるものを実装する他の方法ですが、なぜ元のコードはそのまま動作しませんか? – nnnnnn

0

おそらく、これを行うための「正しい」方法は、副作用のある関数を書くことではありません。それは、配列の変更されたコピーを返すようにするには、関数を書くことができます:

var array1 = [1, 2, 3], 
    array2 = [4, 5, 6], 
    x = getUserInput(), 
    result = doIt(1, x == 1 ? array1 : array2); 

function doIt(arg, original_array){ 
    var copy = [].concat(original_array); 
    // ... 
    return copy; 
} 

時にはそれは避けられないですが、地元の関数はグローバルな状態を変更したときにプログラムがデバッグに非常に難しくなります。

関連する問題