Вопрос о локальной и глобальной области видимости -JavaScipt - PullRequest
0 голосов
/ 10 апреля 2020

Первый раз постер здесь, будь нежным к моей душе. И еще извините, если вы меня не понимаете, я не являюсь носителем английского языка sh.

Вот мой код, и я постараюсь объяснить, что я не понимаю под ним.


var numbers = [1, 2, 3, 4, 5]; 
var total = 0; 
i = 0;

function averageValue(numbers) { 
  var averageValue = 0; 
  if (numbers.length > 0) { 
    for (i = 0; i < numbers.length; i++) { 
      total += numbers[i]; 
    } 
    averageValue = total / numbers.length; 
  } 
  return averageValue; 
} 
var average = averageValue(numbers);

console.log(total);
console.log(i);

Я понимаю, что делает код, это не проблема, но я не понимаю, почему метод console.log не создает переменные - total, а i как 0 - но вместо 15 и 5. Я только недавно изучил область действия JavaScript, и у меня сложилось впечатление, что глобальная область не может получить доступ к локальной области, так почему она может делать это именно в этой ситуации. Я новичок ie и, наверное, просто глупо думаю, но я очень признателен за любую помощь.

1 Ответ

0 голосов
/ 10 апреля 2020

total и i объявляются (с var и как неявный глобал соответственно) за пределами функции.

Затем функция обращается к ним. Он не объявляет их заново с var (что создаст новые переменные с тем же именем в более узкой области видимости). Функция изменяет значения существующих переменных.


Если переменные были объявлены внутри функции, то код вне функции не сможет получить к ним доступ. Вместо этого вы получите исключение:

var numbers = [1, 2, 3, 4, 5];

function averageValue(numbers) {
  var total = 0;
  var i = 0;

  var averageValue = 0;
  if (numbers.length > 0) {
    for (i = 0; i < numbers.length; i++) {
      total += numbers[i];
    }
    averageValue = total / numbers.length;
  }
  return averageValue;
}
var average = averageValue(numbers);

console.log(total);
console.log(i);

И если бы у вас были переменные, объявленные внутри и снаружи функции, то код в функции работал бы только с локальными, оставляя те в более широкой области видимости неизменными :

var numbers = [1, 2, 3, 4, 5];
var total = 0;
i = 0;

function averageValue(numbers) {
  var total = 0;
  var i = 0;

  var averageValue = 0;
  if (numbers.length > 0) {
    for (i = 0; i < numbers.length; i++) {
      total += numbers[i];
    }
    averageValue = total / numbers.length;
  }
  return averageValue;
}
var average = averageValue(numbers);

console.log(total);
console.log(i);
...