JavaScript: Как одновременно объявить переменную var и пустить переменные в цикле for

1

Хотя гипотетический, этот случай озадачил меня. Считаете ли вы это возможным, и если да - как

function count() {

    for (
        let i = 0, k = 0; // <<< can this become sth like 'var i = 0; let k = 0' ?
        i < 10; 
        i++, k++ 
    ) { 
        ...
    }

     // ... so that these log as follows:
     console.log( i ); // 10
     console.log( k ); // undefined or Error
}

count();

Примечание: Одобрено объявлять for (let i=0, k=0;...) или for (var i=0, k=0;...), но может ли i и k объявляться одновременно через var и let соответственно так или иначе?

  • 0
    Извините, это невозможно, и это навсегда. i и k находятся в области видимости цикла и, следовательно, не видны снаружи - и это не должно быть вообще. Просто дайте count () вернуть некоторый кортеж или что-то еще, и вы будете счастливы с этим, так как все правильно инкапсулировано.
  • 0
    @atmin, извините, но то, что вы пишете, может не соответствовать случаю, когда 'i' и 'k' объявляются через 'var', как при объявлении через 'var', обе переменные видны вне области действия цикла for внутри локальной переменной. область действия функции подсчета
Показать ещё 3 комментария
Теги:
ecmascript-6
ecmascript-5

2 ответа

3

Нет, это не допускается грамматикой. Вы можете иметь только одно из ключевых слов var, let и const в const цикла (или вообще ничего).

Решение состоит в том, чтобы просто поместить var вне заголовка цикла, что является хорошей практикой в любом случае, если вы хотите использовать его после цикла:

function count() {
    var i = 0;
    for (
        let k = 0;
        i < 10; 
        i++, k++ 
    ) { 
        …
    }

    console.log( i ); // 10
    console.log( k ); // ReferenceError
}
count();
  • 0
    Где он указывает ключевые слова, разрешенные в заголовке цикла в спецификации?
  • 1
    @chiliNUT: ecma-international.org/ecma-262/#sec-for-statement
2

Объявите переменную с ограниченной функциональностью вне цикла for. Такой вид происходит в любом случае, когда вы используете ключевое слово var в цикле for (var i=...), объявление получает подъем. Затем вы можете использовать let внутри цикла for, чтобы получить область уровня блока. Вы даже можете использовать let для обеих деклараций, так как теперь они не полагаются на подъем, предоставленный var.

function count() {
    var i = 0;
    // or let i = 0;
    for (
        let k = 0;
        i < 10; 
        i++, k++ 
    ) { 
        // 
    }

     // ... so that these log as follows:
     console.log( i ); // 10
     console.log( k ); // undefined or Error
}

count();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню