2015-12-21 8 views
1

Я новичок в javascript и кодировании в целом, и я мог бы использовать некоторую помощь.Глобальная переменная Javascript получает новое значение

Я устанавливаю глобальную переменную (сгенерированные числа), равную другой переменной (числам), чтобы я мог выполнить некоторую проверку в массиве. Однако, когда я изменяю значение чисел, моя глобальная переменная generateNumbers также изменяется. Любая помощь будет оценена по достоинству.

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

Вы говорите: «Я устанавливаю глобальную переменную (сгенерированные числа), равную другой переменной (числам)», но здесь вы фактически устанавливаете 'numbers' в' generatedNumbers': 'numbers = generatedNumbers;' – Tgsmith61591

+0

Ваш код отсутствует закрывающая скобка} для последнего оператора else, это опечатка? –

+0

Где объявляется generateRandomNumber()? – enguerranws

ответ

0

Массивы (и всех прочих типов примитивов) являются пройти по ссылке, не копируются, когда вы используете оператор присваивания = или передать их функции, поэтому любые изменения, внесенные в numbers (или значения элементов numbers), будут отражены в generatedNumbers.

Для вашего массива здесь numbers = generatedNumbers.slice(0); будет достаточно клонировать массив, но имейте в виду, что если содержимое массива не является примитивным типом (например, любой объект, который вы используете для создания ключевого слова), не будет клонирован: оба массива будут ссылаться на одни и те же объекты.

+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(); 
Смежные вопросы