Почему мой цикл for отправляет в массив только тогда, когда в цикле нет скобок

#javascript #arrays #for-loop

#javascript #массивы #for-loop

Вопрос:

Я написал следующую функцию, которая должна регистрировать массив, начинающийся с «0» и заканчивающийся аргументом функции (в данном случае «40»), на консоль.

 function range(num) {
    var holder = [];
    for(var i = 0; i <= num; i  ) {
    holder.push(i);
    return holder;
    }
}
console.log(range(40));
 

Вместо этого регистрируется «undefined». Однако я заметил, что удаление скобок цикла for следующим образом:

 function range(num) {
    var holder = [];
    for(var i = 0; i <= num; i  )
    holder.push(i);
    return holder;
}
console.log(range(40));
 

заставляет функцию работать правильно, и это здорово, за исключением того, что я не понимаю, почему функция теперь работает. Кто-нибудь может объяснить?

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

1. потому что return должен быть вне скобок

2. потому что вы выполняете только одну итерацию в своем цикле со своими скобками

3. Правильный отступ помогает отладке кода. for Без скобок выполняется только цикл holder.push() части. Выполняется return только после завершения цикла, как и должно быть.

4. В первый раз у вас есть return в цикле for, во второй раз return выходит из цикла for.

5. Первый не должен регистрироваться undefined , но [0] .

Ответ №1:

Он return должен быть вне цикла, иначе он покинет функцию после первого нажатия

 function range(num) {
  var holder = [];
  for(var i = 0; i <= num; i  ) {
    holder.push(i);
  }
  return holder; // must be outside
}
console.log(range(40));
 

ОДИН оператор в цикле не нуждается в скобках, но в любом случае рекомендуется иметь их. Вот приведенное выше с одним оператором.

 function range(num) {
  var holder = [];
  for(var i = 0; i <= num; i  ) holder.push(i);
  return holder; // must be outside
}
console.log(range(40));
 

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

1. Ах, я понимаю, поэтому цикл for не всегда требует скобок. И я возвращал значение до того, как цикл смог выполняться. Теперь это имеет смысл

Ответ №2:

Когда у вас есть скобки, вы выполняете обе строки

 for(var i = 0; i <= num; i  ) 
{ 
holder.push(i);     // inside loop
return holder;      // inside loop
}
 

Это означает return , что после первого запуска и дальнейших итераций не происходит.

Когда у вас нет скобок, вы выполняете только первую строку в цикле

 for(var i = 0; i <= num; i  ) 
holder.push(i);
return holder;    // this is outside loop
 

Вот почему без скобок выполняются все ваши операторы push, со скобками это происходит только один раз, потому что вы return немедленно.

Ответ №3:

Потому что теперь ваш код читает:

 for( var i=0; i<=num; i  ) {
    holder.push(i);
}
return holder;
 

for Цикл (или if оператор, while цикл и т. Д.) Без фигурных скобок влияет только на следующую строку.

Ответ №4:

Вы возвращаетесь в цикл for, что означает, что он выполняется только один раз.

Когда вы снимаете скобки, он автоматически принимает следующую строку в качестве цикла, что означает, что оператор return теперь находится вне цикла.

Ответ №5:

В вашем первом коде вы завершаете работу функции в первом цикле:

 function range(num) {

var holder = []; //1
for(var i = 0; i <= num; i  ) { //2
    holder.push(i); //3
    return holder; //4 goes out  of range function, instead, you should use a "break"
    }
}
console.log(range(40));
 

Пока вы не ставите скобки для for цикла, if условия и т.д., «скобки» по умолчанию используются только для ПЕРВОЙ строки ниже :

Это :

 function range(num) {

var holder = [];
for(var i = 0; i <= num; i  )
    holder.push(i);
    return holder;
}
console.log(range(40));
 

выглядит так :

 function range(num) {

var holder = [];
for(var i = 0; i <= num; i  ) {
    holder.push(i);
}
    return holder;
}
console.log(range(40));