Может кто-нибудь объяснить мне область видимости блока javascript.
Я не могу воспроизвести приведенный ниже пример, предоставленный w3schools;
Может кто-нибудь объяснить мне область видимости блока javascript.
Я не могу воспроизвести приведенный ниже пример, предоставленный w3schools;
До того, как была выпущена последняя версия Javascript (ES6/ES2015), Javascript имел только локальную область действия и глобальную область действия. Вот пример локальной области:
function x(){
var y = 1
}
console.log(y) // undefined because y is in the local scope of function x
Вот пример глобальной области видимости:
var a = 1
function sayOne() {
console.log(a) // prints 1 because the "a" variable is global
}
Таким образом, в глобальной области переменная в основном видна всем остальным в программе, но в локальной области она скрыта и закрыта от всего, что находится за пределами родительской функции.
Как показывает ваш снимок экрана, Javascript НЕ имеет области действия на уровне блоков. Таким образом, предоставленный вами код вернет i, несмотря на то, что он находится ВНЕ блока цикла for.
for (var i = 0, i < 10) {
// some code here
}
return i // this will return i since i is global and will not be undefined
Но с блочной областью видимости переменная будет существовать только внутри этого блока кода, например, в циклах. Давайте взглянем на тот же код, но с областью видимости блока ES6 «let», который работает так же, как «var», но имеет область видимости блока.
for (let i = 0, i < 10) {
// some code here
}
return i // this will now return undefined because i is only defined within
// the for loop
До ES5 JS не поддерживает область видимости уровня block
. Под block
я подразумеваю любой фрагмент кода, заключенный в {}
.
Поэтому, если вы пишете тот же код на другом языке блочного уровня, таком как C #, Java, C ++ и т. д., переменная i
будет существовать только для области, ограниченной {}
цикла for
. Вне цикла он был бы недоступен.
Однако в мире JS все немного по-другому, или, лучше сказать, were different
до ES6, который позволял block level scope
ing использовать ключевое слово let
.
Таким образом, приведенный выше код интерпретируется как
var i; // i is declared in the containing scope
for(i = 0; i < 10; i++) {
... // some code
}
return i; // therefore accessible here
Если бы это было на уровне блока, i
был бы недоступен вне цикла for для возврата.
for(var i = 0; i< 10; i++){
}
return i; // i is not accessible here in block scoped language