Странность порядка выполнения кода Javascript - PullRequest
4 голосов
/ 04 февраля 2012

У меня есть раздел Javascript / Coffeescript, который, кажется, выполняется не по порядку.

console.log list
console.log list[card_number]
if list[card_number]
  console.log "MATCHES"
  new_card = list[card_number]
else
  console.log "NO MATCHES"
  new_card = create_new_card(card_number)

create_new_card: (card_number) ->
  new_card =
    card_number: card_number
  list[new_card.card_number] = new_card
  return new_card

Каждый раз, когда я запускаю это, первый console.log показывает список карточек, который включает new_card Даже если карта еще не была создана .Затем он ВСЕГДА попадает в else, независимо от того, сколько раз он запускается.

Если я попытаюсь запустить list[<card_number>] в консоли Javascript после запуска этого кода, я получаю нужный объект, но каждый разкод работает сам по себе, происходит то же самое.

Ответы [ 3 ]

5 голосов
/ 04 февраля 2012

В google chrome, если вы хотите регистрировать объекты в том состоянии, в котором они находились на момент регистрации, вам нужно зарегистрировать объект-клон или просто его преобразовать в строку.

var a = [];
console.log(a);
a[0] = 3;

Будет регистрировать [3]потому что он регистрирует живой объект, в то время как он регистрирует []:

var a = [];
console.log(JSON.parse(JSON.stringify(a)));
a[0] = 3;

Это также регистрация живого объекта, но это одноразовый клон, который был клонирован в тот момент, когда a didnУ него нет элементов.

Это не связано с возможными логическими ошибками в вашем коде, на которые указал @CallumRogers.

1 голос
/ 04 февраля 2012

Вы используете Chrome? console.log не выполняется немедленно . Это позор, но для нас это очень плохо.

1 голос
/ 04 февраля 2012

Ваша create_new_card функция неверна - вы вызываете new_card.number вместо new_card.card_number, что всегда приводит к добавлению undefined в список, что приводит к наблюдаемому вами поведению.Правильная версия:

create_new_card: (card_number) ->
  new_card =
    card_number: card_number
  list[new_card.card_number] = new_card
  return new_card
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...