Функция внутри для цикла - PullRequest
0 голосов
/ 16 марта 2019

Я не могу понять результат.Я понимаю первые два набора вывода ( func01 1 и func2 01 - func2 05 ).Но остальное сбивает с толку.

Насколько я понимаю, после первого выполнения цикла for в func01() я получаю значение 2, а затем 3 из-за функции func02(), но все же я <=3 в <code>func01().Я не знаю, почему на выходе нет func01 2 и func01 3 .

function func02(){
  for (i = 1; i <= 5; i++){
    document.write("&nbsp;&nbsp;func02 " + i + "<br>");
  }
}

function func01(){
  for(i = 1; i <= 3; i++){
    document.write("func01 " + i + "<br>");
    func02();
  }
}

func01();

Ответы [ 4 ]

1 голос
/ 16 марта 2019

Когда вы присваиваете переменную без использования var, и она не существует нигде в текущей области, она ищется в следующей области вверх. Если его там нет, проверяется следующий объем и т. Д.

Если переменная не найдена в любой области видимости, она присваивается глобальной области. Таким образом, и func01, и func01 ссылаются на одну и ту же переменную i и обновляют ее. Итак, func02 работает, зацикливается и заканчивается. Затем к моменту, когда он достигает func01, i равен 6, и цикл не запускается снова в func0.

Вы можете получить ожидаемый результат, если измените счетчики на var. Это охватит i функциями, в которых они находятся.

function func02(){
  for (var i = 1; i <= 5; i++){
    document.write("&nbsp;&nbsp;func02 " + i + "<br>");
  }
}

function func01(){
  for(var i = 1; i <= 3; i++){
    document.write("func01 " + i + "<br>");
    func02();
  }
}

func01();
1 голос
/ 16 марта 2019

Это результат, который я получил (отформатированный)

func01 1
func02 1
func02 2
func02 3
func02 4
func02 5

func01 вызывается, устанавливает i (который является глобальной переменной) равным 1 и печатает строку Тогда func01 звонит func02 func02 сбрасывает i в 1, а затем печатает строку для каждого i=1,2,3,4,5. Затем управление возвращается к func01. Он завершил первую итерацию цикла. Значение i равно 5. Затем он сравнивает i (как его глобальную переменную) с 3. Видя, что 5 больше, цикл заканчивается.

0 голосов
/ 16 марта 2019

user202729 верно.В javascript, если вы не объявляете переменную, она принимает глобальную область вместо взятия области действия функции, в которой используется эта переменная.

Объявите вашу переменную i следующим образом:

for(var i = 1;i <= 5 ; i++)

или вы можете объявить переменную в начале функции, например,

var i;

function func02(){

  for (var i = 1; i <= 5; i++){
    document.write("&nbsp;&nbsp;func02 " + i + "<br>");
  }
}

function func01(){
  for(var i = 1; i <= 3; i++){
    document.write("func01 " + i + "<br>");
    func02();
  }
}

func01();

Обращайтесь к https://www.w3schools.com/js/js_scope.asp и изучите область видимости переменных JavaScript.

0 голосов
/ 16 марта 2019

Вы не определили i как локальную переменную области видимости, поэтому она создается как глобальная переменная.Используйте let или var:

 

function func02(){
  for (i = 1; i <= 5; i++){
document.write("&nbsp;&nbsp;func02 " + i + "<br>");
  }
}

function func01(){
  for(i = 1; i <= 3; i++){
document.write("func01 " + i + "<br>");
func02();
  }
}

func01();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...