2013-12-23 2 views
-1

Просто пытаюсь распечатать h1.name, чтобы передать консоль, но я получаю ошибку ReferenceError: h1 is not defined. Неважно, если я набираю 1, 2 или 3, все равно та же ошибка. Что я делаю не так?Простая переменная не указана. Исходная ошибка в Javascript

function Hand(name, sChips) { 
    this.name = name; 
    this.sChips = sChips; 
} 

function start() { 
var nHands = prompt("How many hands do you want to play?(1,2, or 3)"); 
var nHands = Number(nHands); 
    if (0 < nHands < 4) { 
     if (nHands === 1) { 
      var h1 = new Hand("First Hand", 150000); 
     } 
     else if (nHands === 2) { 
      var h1 = new Hand("First Hand", 75000); 
      var h2 = new Hand("Second Hand", 75000); 
     } 
     else if (nHands === 3) { 
      var h1 = new Hand("First Hand", 50000); 
      var h2 = new Hand("Second Hand", 50000); 
      var h3 = new Hand("Third Hand", 50000); 
     } 
    else { 
     start(); 
    } 
    } 
}; 

start(); 

console.log(h1.name) 
+2

varibale 'h1' существует только внутри функции' start() ', это локально. –

+0

Это не идеальное объявление var в любом случае. Вы должны объявить свои переменные в начале функции. Переменные JavaScript являются только функциями, поэтому объявление переменных внутри блока 'if-else' бессмысленно – jasonscript

+0

просто вернет то, к чему вы хотите получить: return {h1: h1, h2: h2} и ссылаться так: start() .h1.name; Вы должны выполнить возврат до последнего «}» в своей стартовой функции. –

ответ

3

Вы должны объявить h1 вне функции start, так что он будет виден код за пределами функции start.

var h1, h2, h3; 

function start() { 
    var nHands=parseInt(prompt("How many hands do you want to play?(1,2 or 3)")); 
    ... 
    if (nHands === 1) { 
     h1 = new Hand("First Hand", 150000); 
    ... 

Примечания:

  1. Это не питон, так что это условие может не работать, как предполагалось

    if (0 < nHands < 4) { 
    

    что вам нужно

    if (nHands < 4 && nHands > 0) { 
    
  2. Вы объявляете nHands дважды, что не является необходимым, вы можете преобразовывать входные данные в числа, как этот

    var nHands=parseInt(prompt("How many hands do you want to play?(1,2 or 3)")); 
    
  3. Это всегда хорошо, чтобы включать в себя else состояние, к вашему, если-иначе лестнице.

+0

Это не решит проблему. переменная 'h1' объявляется в функции' start', что означает, что когда OP пытается напечатать 'h1', он выходит из области – jasonscript

1

Вы также можете просто поместить объекты руки в хеш, вот так. Предостережение: это просто позволяет вашим «h1, h2, h3» быть доступным, как вы ожидаете. плакат «thefourtheye» дал надежную/ясную идею о том, где, вероятно, вы хотите пойти.

function Hand(name, sChips) { 
    this.name = name; 
    this.sChips = sChips; 
} 
var h = {}; //global h obj 
function start() { 
var nHands = prompt("How many hands do you want to play?(1,2, or 3)"); 
var nHands = Number(nHands); 
    if (0 < nHands < 4) { 
     if (nHands === 1) { 
      h.h1 = new Hand("First Hand", 150000); 
     } 
     else if (nHands === 2) { 
      h.h1 = new Hand("First Hand", 75000); 
      h.h2 = new Hand("Second Hand", 75000); 
     } 
     else if (nHands === 3) { 
      h.h1 = new Hand("First Hand", 50000); 
      h.h2 = new Hand("Second Hand", 50000); 
      h.h3 = new Hand("Third Hand", 50000); 
     } 
    else { 
     start(); 
    } 
    } 

}; 

    start(); 
    console.log(h.h2.name, h['h2'].name) 
+0

да, также называемой ассоциативным массивом. –

Смежные вопросы