2016-10-23 14 views
2

何らかの理由でグローバル変数の変更を拒否するfor-loopを書きました。代わりに、一時的に変更するローカル変数を作成するように見えます。私のコードを要約すると以下のようになります。for-loopはグローバル変数を変更しませんか?

var clubsArray = [obj, obj, obj]; 

//each obj contains a property of "goalsFor" which holds an integer 

var madridTotalGoals = 0; 
var barcaTotalGoals = 0; 

function findTotalGoals(clubsArray, totalGoals) { 

    for(var i = 0; i < clubsArray.length; i++) { 

     totalGoals += clubsArray[i].goalsFor; 
    } 
} 

findTotalGoals(clubsArray, barcaTotalGoals); 

// this loops properly and does the math, but it never changes the value of barcaTotalGoals 

完全なコードには、「クラブ」オブジェクトを保持する多数の配列があります。それぞれは、値として整数を保持するプロパティーキー "goalsFor"を含んでいます。また、グローバルに宣言された多数のtotalGoals変数(ここでは2つの変数が指定されています)があります。

グローバル変数(barcaTotalGoalsなど)がこの関数に渡されたときに変更されない理由は誰にも分かりますか?このループの各ステップをログに記録すると、計算が実行されますが、結果は格納されません。私はこれが以前に尋ねられている場合は謝罪しますが、私は徹底的に調査しました。

+1

JavaScriptは値渡しです。 'totalGoals'は' barcaTotalGoals'の値を取得しますが、それを変更しません。 'totalGoals'への変更は' barcaTotalGoals'を変更しません。 – Li357

答えて

0

あなたが渡そうとしている変数はvalueで、referenceではありません。だから、forループが

function findTotalGoals(clubsArray, totalGoals) { 

    for(var i = 0; i < clubsArray.length; i++) { 

     totalGoals += clubsArray[i].goalsFor; 
    } 
    barcaTotalGoals = totalGoals; 
} 
+0

重複がある場合は、そのように投票を終了してください。 – Li357

+0

急いで反応してくれてありがとう、ここで私の無知を言い訳しなければならないだろうが、私は複数の変数(例えば、12)を変更するために関数を使用したい場合は、 ? – roz0n

+0

@AndrewLiこのリンクは間違いなくOPが値渡しと参照の違いを理解するのに役立ちますが、OPはこの概念がこの概念に依存していることも知らないでしょうし、stackoverflowの新しいコーナーには厳しい必要はありません。それはちょっと私の意見だ – Abhinav

0

を終了すると、あなたが値ではなく、参照渡しされている値を割り当てることができ、元の変数

に影響を与える文句を言わない... 代わりに、あなたはこのように試みることができます:

clubsArray = [obj, obj, obj]; 

var totalGoals = { 
    madrid: 0, 
    barca: 0 
} 

function goalsByCountry(clubsArray, totalGoalsClub) { 

    for(var i = 0; i < clubsArray.length; i++) { 

     totalGoals[totalGoalsClub] += clubsArray[i].goalsFor; 

    } 

} 

goalsByTeam(clubsArray, 'barca'); 
関連する問題