2015-12-21 191 views
1

我是新來的JavaScript和編碼的一般,我可以使用一些幫助。Javascript全局變量設置爲新值

我設置一個全局變量(generatedNumbers)等於另一個變量(數字),以便我可以對數組做一些驗證。但是,當我更改數字的值時,我的全局變量generatedNumbers也得到了更改。任何幫助,將不勝感激。

var generatedNumbers; 

function generateNumbers(numberOfNumbers) { 
    'use strict'; 
    var i; 
    generatedNumbers = []; 
    for (i = 0; i < numberOfNumbers; i = i + 1) { 
     generatedNumbers.push(generateRandomNumber(9).toString()); 
    } 
} 

function checkEachValidNumberUsed(userExpression, numbers) { 
    'use strict'; 
    var i, j; 
    for (i = 0; i < userExpression.length; i = i + 1) { 
     for (j = 0; j < numbers.length; j = j + 1) { 
      if (userExpression[i] === numbers[j]) { 
       numbers.splice(j, 1); 
       window.console.log(generatedNumbers); 
      } 
     } 
    } 
    if (numbers.length !== 0) { 
     return true; 
    } 
} 

function validateExpression(userExpression) { 
    'use strict'; 
    var numbers, validUserInput; 
    numbers = generatedNumbers; 
    window.console.log(generatedNumbers); 
     if (checkEachValidNumberUsed(userExpression, numbers)) { 
      document.getElementById("feedbackText").innerHTML = "Each number must be used exactly once."; 
    } else { 
     return true; 
} 
+2

你說「我設置一個全局變量(generatedNumbers)等於另一個變量(數字)」,但在這裏,你實際上將'numbers'設置爲'generatedNumbers':'numbers = generatedNumbers;' – Tgsmith61591

+0

你的代碼是錯過了最後一個else語句的右括號},這是一個錯字嗎? –

+0

聲明的地方generateRandomNumber()? – enguerranws

回答

0

陣列(和所有其他非基本類型),例如明確地這樣做副本是傳址參考,不可複製,當您使用賦值運算符=或將它們傳遞給函數,因此對numbers(或者numbers的元素的值)所做的任何更改都將反映在generatedNumbers中。

對於此處的數組,numbers = generatedNumbers.slice(0);將充分克隆該數組,但請記住,如果數組內容不是基本類型(例如,使用關鍵字new創建的任何對象)將不會被克隆:兩個數組都會引用相同的對象。

+0

謝謝你解釋! – Ninepence

0

這是因爲它們都指向同一個對象。如果您想複製generatedNumbers(我認爲您想在validateExpression中執行此操作),請使用slice

numbers = generatedNumbers.slice(0); 
0

在Javascript中,如果你有一個數組

var a = [1,2,3,4]; 

後分配 a另一個變量

var b = a; 

兩個都是指非常相同的陣列對象...例如

b.push(99); 

a也會看到突變數組。

如果你想使你需要與

var b = a.slice();