var , она объявляется глобально или локально, если объявляется внутри функции. Ключевое слово let ведет себя аналогично, но с некоторыми дополнительными особенностями. Когда вы объявляете переменную с ключевым словом let внутри блока, оператора или выражения, его область действия ограничена этим блоком, оператором или выражением. Например: var numArray = [];С ключевым словом
for (var i = 0; i <3; i++) {
numArray.push(i);
}
console.log (numArray);
// возвращает [0, 1, 2]
console.log(i);
// возвращает 3
var переменная i объявляется глобально. Поэтому, когда выполняется i++ , обновляется глобальная переменная. Этот код похож на следующий: var numArray = [];Такое поведение вызовет проблемы, если вы должны были создать функцию и сохранить ее для последующего использования внутри цикла for, который использует переменную
var i;
for (i = 0; i <3; i++) {
numArray.push(i);
}
console.log (numArray);
// возвращает [0, 1, 2]
console.log(i);
// возвращает 3
i . Это связано с тем, что хранимая функция всегда будет ссылаться на значение обновленной глобальной переменной i . var printNumTwo;Как вы можете видеть,
for var i = 0; i <3; i ++) {
if (i === 2) {
printNumTwo = function () {
return i;
};
}
}
console.log (printNumTwo ());
// возвращает 3
printNumTwo() печатает 3, а не 2. Это связано с тем, что значение, присвоенное i было обновлено, и printNumTwo() возвращает глобальный i , а не значение, которое i имел, когда функция была создана в цикле for. Ключевое слово let не следует этому поведению: «use strict»;
let printNumTwo;
for (let i = 0; i <3; i ++) {
if (i === 2) {
printNumTwo = function () {
return i;
};
}
}
console.log (printNumTwo ());
// возвращает 2
console.log (я);
// возвращает «i не определен»
i не определен, потому что он не был объявлен в глобальной области. Он объявляется только в объявлении цикла for. printNumTwo() вернула правильное значение, потому что три разные переменные i с уникальными значениями (0, 1 и 2) были созданы ключевым словом let в цикле. i внутри if-выражения была отдельной переменной от i объявленной в первой строке функции. Не забудьте использовать ключевое слово var в любом месте вашего кода. Это упражнение предназначено для иллюстрации разницы между ключевыми словами var и let и область видимости объявленных переменных. При написании функций, аналогичной той, что используется в этом упражнении, часто лучше использовать разные имена переменных, чтобы избежать путаницы. var не существует в коде.
testString: 'getUserInput => assert(!getUserInput("index").match(/var/g),"var does not exist in code.");'
- text: 'Переменная i объявленная в операторе if, должна равняться «области блока».'
testString: 'getUserInput => assert(getUserInput("index").match(/(i\s*=\s*).*\s*.*\s*.*\1("|")block\s*scope\2/g), "The variable i declared in the if statement should equal "block scope".");'
- text: checkScope() должен возвращать "область действия"
testString: 'assert(checkScope() === "function scope", "checkScope() should return "function scope"");'
```