2017-02-18 2 views
1

Все ли переменные области блока в блоке цикла цикла подняты над заголовком цикла?Переменная области видимости блока javascript ES6 в заголовок

var x = 4; 

    for(let i = 3; i < x; i++) { 
     let x = 2; 
     ... 
    } 

Должно ли это выдавать ошибку мертвой зоны на x каждый раз, когда i сравнивается с x в заголовке цикла? Я понимаю, что я заблокирован в области блоков, но почему бы не x?

+0

Что вы пытаетесь достичь? – guest271314

+0

Я добавляю переменные с привязкой к блоку в свой интерпретатор javascript-database, и мне нужно знать, как правильно обрабатывать этот случай. Но, я думаю, правильный подход заключается в том, чтобы обработать блок цикла как вложенный в заголовок цикла. Таким образом, 'let i' в заголовке отображается в блоке цикла, но' let x' в блоке цикла не отображается в заголовке цикла. – Malbrain

+0

Не знаете, в чем проблема? Почему вы определяете 'let x = 2' в цикле' for', если 'var x = 4' определяется вне цикла' for'? – guest271314

ответ

0

Все ли переменные области блока в блоке цикла цикла подняты над заголовком цикла?

Нет, они поднимаются в блоке сфере

Если это производит ошибку мертвой зоны на й каждый раз, когда я по сравнению с й в заголовке цикла? Я понимаю, что я заблокирован в области блоков, но почему бы не x?

Нет, потому что x в заголовке контура ссылается x определяются как 4 var x = 4

Вы не можете получить доступ к let переменным до того, как было объявлено, как это время между обзором и декларацией является Протяжен.

ex.

console.log(x) // Reference Error, x is in TDZ 
let x = 4 
console.log(x) // --> 4 
0

test run

основано на том, что, я думаю, пусть х доступны только в том, что за рамки.

0

Я неправильно понял, и думал, что будет только один блок. Я отказался от принятия двух произвольных переменных в выражении i < x и должен был решить, для какой области блока их искать, что невозможно определить.

Правильный подход заключается в создании двух вложенных блоков, одного для заголовка цикла и одного для тела цикла. Это означает, что let i отображается как в заголовке цикла, так и в области тела цикла, а let x в цикле видна только в области тела цикла. Легкий peasy, лимон squeezy.

+0

_ «Правильный подход состоит в том, чтобы построить две вложенные области блоков». Оператор for не является блоком, а для тела его не должно быть. Так, например, 'for (let i = 0; i <10; i ++) console.log (i);' создает только одну область, и это не область блоков. – zeroflagL

+0

Правильно, это именно то, что я сказал: заголовок цикла создает область, содержащую 'let i = 0;', и в вашем случае не будет области вложенного тела цикла. Но когда тело цикла является блоком, область блока для него будет создана, вложенной в область заголовка цикла. – Malbrain

1

Соответствующий раздел спецификации языка является 13.7.4

Если for заявление содержит let или const декларацию, то область применения создается.

Каждая итерация создает область видимости, если оператор for содержит объявление let.

Если тело - это блок, то создается область действия.

Вот некоторые примеры и область применения, которые создаются:

//no scope 
for(i = 0; i<3; i++) console.log(i); 

//no scope 
for(var i = 0; i<3; i++) console.log(i); 

//for scope and iteration scope 
for(let i = 0; i<3; i++) console.log(i); 


// for scope, iteration scope and block scope 
for(let i = 0; i<3; i++) { 
    console.log(i); 
} 

Почему нам нужна итерация области? Для затворов:

for(let i = 0; i<3; i++) { 
    setTimeout(() => console.log(i), 10); 
} 

Выход без итерационного объема: 3,3,3.С масштабом итерации: 0,1,2

+0

Благодарим за указание соответствующей секции стандарта ECMA. Как я предположил, создание вложенных областей, один для любого заголовка цикла 'let', а затем, если необходимо, второй, вложенный, один для любого' let' в теле цикла. – Malbrain

Смежные вопросы