Почему это возвращает 2 вместо 1? Кажется, второй «var» молча игнорируется.Использует ли javascript лексическую область видимости?
function foo()
{
var local = 1;
{
var local = 2;
}
return local;
}
foo()
/*
2
*/
Почему это возвращает 2 вместо 1? Кажется, второй «var» молча игнорируется.Использует ли javascript лексическую область видимости?
function foo()
{
var local = 1;
{
var local = 2;
}
return local;
}
foo()
/*
2
*/
От the MDN:
JavaScript не имеет блок операторов сферы; скорее, переменная , объявленная в блоке, является локальной для функции (или глобальной области) , что блок находится внутри.
Область действия переменной в JavaScript - это вся функция, в которой она объявлена (или глобальная область), поэтому у вас есть только одна переменная local
.
Ваш код эквивалентен
function foo()
{
var local;
local = 1;
{
local = 2;
}
return local;
}
foo()
Обратите внимание, что ES6 (новая норма JavaScript) делает ввести lexical scoping with let
но it's not yet really available.
Он доступен для гармонии firefox и nodejs. – simonzack
@simonzack Разве вы не заметили, что я связан с таблицей Kangax? Если ОП не кодирует серверную сторону, он не может позволить себе быть несовместимым с IE и Chrome, поэтому я сказал «не реально доступен». –
А я вижу, я не нажимал на вашу ссылку. – simonzack
В javascript есть только область действия уровня и глобальная область видимости. вы не можете создать область блока и не добавляет особого смысла и не создает никакой области.
И это, как ваш код заканчивает
function foo()
{
var local = 1;
local = 2;
return local;
}
foo();
В ES6 вы можете создать области уровня блока с помощью Let. ES6 пока не поддерживается. подробнее об этом here
Следует отметить, что в ближайшем будущем лексическая область будет доступна с ключевым словом ES6 let. – Capaj
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let –