Невозможно получить доступ к переменной, объявленной внутри функции, из тела if

#javascript #typescript #nuxt.js #vuejs3 #nuxt3

#язык JavaScript #машинописный текст #nuxt.js #vuejs3 #nuxt3

Вопрос:

Я пытаюсь получить доступ к переменной, которую я объявил в верхней части функции изнутри оператора if (также в той же функции). Это код, который я написал:

 function getAround(x: number, y: number): number {  console.log({x, y});  let around: number = 0;  const max = (props.size - 1);  console.log({around});  // top  if (y gt; 0 amp;amp; grid[y - 1][x].bomb) {  console.log({max: this.max});  around  ;  }  // top right  if (y lt; 0 amp;amp; x gt; max amp;amp; grid[y - 1][x   1].bomb) {  around  ;  }   //right  if (x lt; max amp;amp; grid[y][x   1]) {  around  ;  }   //bottom right  if (y lt; max amp;amp; x lt; max amp;amp; grid[y   1][x   1]) {  around  ;  }   //bottom  if (y lt; max amp;amp; grid[y   1][x]) {  around  ;  }   //left bottom  if (y lt; max amp;amp; x gt; 0 amp;amp; grid[y   1][x - 1]) {  around  ;  }   //left  if (x gt; 0 amp;amp; grid[y][x - 1]) {  around  ;  }   //top left  if (y gt; 0 amp;amp; x gt; 0 amp;amp; grid[y - 1][x - 1]) {  around  ;  }  return around; }  

По какой-то причине это не удается при попытке увеличить, поэтому я попытался создать более простую версию:

 function simple(x: number, y: number): number {  let around: number = 0;  if (x gt; y) {  around  ;  }  return around; }  

Простая версия работает по какой-то причине. Насколько я понимаю, оба они должны работать нормально, не так ли? Вот ошибка, которую я получаю:

 Error while mounting app: TypeError: Cannot read properties of undefined (reading '1')  at getAround (PlayingField.vue:89)  at PlayingField.vue:50  at Array.forEach (lt;anonymousgt;)  at PlayingField.vue:50  at Array.forEach (lt;anonymousgt;)  at getAllAround (PlayingField.vue:49)  at generateGrid (PlayingField.vue:41)  at setup (PlayingField.vue:45)  at callWithErrorHandling (runtime-core.esm-bundler.js:6708)  at setupStatefulComponent (runtime-core.esm-bundler.js:6317)  

Строка 89 содержит следующий код:

 console.log({max: this.max});  

Я не уверен, важно ли это, но я использую Nuxt 3, и код находится внутри script setup тега.

Комментарии:

1. Вы неправильно поняли сообщение об ошибке, grid[n] не определено, когда вы пытаетесь прочитать grid[n][1] .

2. Кроме того, в будущем, если вы предоставите сообщение об ошибке, сообщите нам, какая строка вызвала его, или в этом случае вы могли бы дать нам ссылку на код игровой площадки.

3. @Teemu Я не совсем понимаю. Ошибка указывает на строку 89 в PlayingField.vue. Эта строка такова: console.log({max: this.max}); .

4. Я сомневаюсь, что определение местоположения немного не так. Может быть, это строка выше, где у вас есть grid[y - 1][x] . Проверьте , что y-1 находится непосредственно перед if этим, и grid[y - 1] действительно ли существует, когда x == 1 .

5. Да. Похоже, он был отключен на одну строчку. Исправлена проблема, и теперь она работает, спасибо!

Ответ №1:

Строка, упомянутая в ошибке, отключена на единицу, и на самом деле ошибка была в строке 88. После исправления моего утверждения if теперь оно работает безупречно.

Для дальнейшего использования: Используемый браузер был Edge (Chromium) версии 96.0.1054.41 в Windows 10.