2015-12-21 108 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();