2016-06-02 6 views
0

私はgeneratedPatternと呼ばれるグローバル変数を持っているとします。私はfunction animate()でそれを使用したいが、その価値を変更したくない。したがって、関数のローカル変数(たとえばvar patternToAnimate)にgeneratedPatternをコピーし、次にpatternToAnimateを使用します。関数内のグローバル変数のコピーを使用する

patternToAnimateの変更はgeneratedPatternを変更しますか?もしそうなら、どうすればこの問題を回避できますか?

ie。どのようにグローバルに変更することなく関数内でgeneratedPatternをローカルで使用するのですか?

編集:

誰かがコードを求めているので:

function animateGeneratedPattern() { 
var patternToAnimate=generatedPattern; 
function animateNextPattern(lightup) { 
    if (!patternToAnimate|| patternToAnimate.length === 0) { 
     return; 
    } 

    switch(patternToAnimate[0]) { 
     case 1: 
      animateRed(); 
      break; 
     case 2: 
      animateGreen(); 
      break; 
     case 3: 
      animateBlue(); 
      break; 
     case 4: 
      animateYellow(); 
      break; 
    } 
    if (lightup) { 
     // Long delay before turning light off 
     setTimeout(function() { 
      animateNextPattern(false); 
     }, 500); 
    } 
    else { 
     patternToAnimate.splice(0, 1); 
     // Small delay before turning on next light 
     setTimeout(function() { 
      animateNextPattern(true); 
     }, 10); 
    } 
} 

animateNextPattern(true); 
} 

をpatternToAnimateがスプライシングされます場合は、そのgeneratedPattern

+0

それが依存しています。 –

+0

これは、グローバルにvar generatedPattern = [];として定義されています。 – leoOrion

答えて

2

他の場所でgeneratedPatternを使用して変更すると、よく変わります。

genratedPatternの値を変更せずに別の機能で使用する場合は、実際にコピーする必要があります。しかし、注意してください、参照としてそれを保存しない:

ここ
var generatedPattern = [1, 2, 3]; 
var patternToAnimate = generatedPattern; 

patternToAnimategeneratedPatternへの参照です。だからあなたが変更するときpatternToAnimategeneratedPatternも同様に変更されます。彼らは文字通り同じ配列なので。

あなたが別の配列をコピーしたい場合は、patternToAnimateslice

var generatedPattern = [1, 2, 3]; 
var patternToAnimate = generatedPattern.slice(); 

を使用すると、元の配列を変更することなく変更することができるgeneratedPatternの新しいコピーです。

デモ: `generatedPattern`がプリミティブな値であるかどうhttps://jsfiddle.net/kx7f766w/1/

+0

関数内で 'var patternToAnimate = generatedPattern;'を実行すると、両方とも同じ配列を参照します?? – leoOrion

+0

@leoOrion correct:https://jsfiddle.net/e5e1z1kw/ – Pimmol

0

ちょうど下の範囲内で新しい変数にグローバル変数を割り当てるん。

console.clear(); 
 
console.log('no problem') 
 
var global = 123; 
 
(function() { 
 
    var local = global; 
 
    local = 321; 
 
    console.log("local is",local); 
 
})(); 
 
console.log("global is",global); 
 
console.log('Actually change the global variable') 
 
global = 123; 
 
(function() { 
 
    global = 321; 
 
})(); 
 
console.log("global is",global);

ローカルスコープ変数はグローバル変数にリークしません。

+0

私が試したことはありますが、ローカル変数を変更すると、グローバル変数も変更されます。 – leoOrion

+0

コード例を投稿してください。 –

+0

Iveは質問を編集してコードを追加しました。 – leoOrion

関連する問題