В Javascript я могу использовать переменную до ее объявления?
Некоторое время я задавался вопросом, могу ли я использовать переменную в JS до ее определения,
например:
var country = "USA";
switch (country) {
case "USA":
country = i;
case "blach":
//not finished yet
}
/*
put a whole
bunch more code here
*/
var i = 10;
Это действительно? Это разрешено? И если да, то каков технический термин для этого?
Ответы
Ответ 1
Это метод, используемый движком JavaScript под названием hoisting. Парсер будет считывать всю функцию перед ее запуском, и любые объявления переменных (т.е. С использованием ключевого слова var
) будут выполняться так, как если бы они находились в верхней части области содержимого. Таким образом, ваш код ведет себя как:
var country;
var i;
country = "USA";
switch (country) {
case "USA":
country = i;
case "blach":
//not finished yet
}
i = 10;
Итак, i
объявляется во всей области видимости, но его значение равно undefined
, пока не будет выполняться оператор i = 10
.
В терминах ECMAScript, когда функция вызывается, функция new lexical scope строит свой VariableEnvironment
до того, как выполняется какой-либо из функциональных кодов. В ECMAScript 10.5, шаг 8:
8. Для каждого VariableDeclaration... d в коде, в исходном текстовом порядке do
а. Пусть dn - Идентификатор в d.
...
я. Позвонить envs CreateMutableBinding конкретный метод, передающий dn и configurableBindings в качестве аргументов.
II. Вызовите envs метод SetMutableBinding, проходящий через dn, undefined
и строгий, как аргументы.
Это довольно глоток, но в основном он говорит:
Перед запуском функции просмотрите исходный код функции для объявлений типа var [identifierName]
.
Для каждого найденного объявления создайте новую переменную в области функций с именем [identifierName]
, используемым в объявлении, а затем установите для нее значение undefined
Ответ 2
Он назвал переменную подъемную силу, и это хорошая концепция для понимания, поскольку иногда может быть создавать ошибки, которые являются трудными для отслеживания.
Например:
var stuff = 'stuff';
function() {
console.log(stuff); //outputs 'undefined'
var stuff = 'other stuff';
console.log(stuff); //outputs 'other stuff'
}
Первый console.log
выводит undefined
, потому что var stuff
в функции был поднят в верхней части функции.
//theoretical compiled output
var stuff = 'stuff';
function() {
var stuff; //has not been defined
console.log(stuff);
stuff = 'other stuff'; //defined here
console.log(stuff);
}
Без знания переменной подъема этот результат может запутать.
По этой причине, если вы посмотрите на профессионально разработанный JavaScript-код, как правило, вы увидите, что все переменные в функции объявлены вверху.
Ответ 3
Да. В JavaScript переменные подняты
Оператор переменной объявляет переменные, созданные, как определено в 10.5. Переменные инициализируются при undefined при создании. Переменной с инициализатором присваивается значение его AssignmentExpression , когда выполняется VariableStatement, а не при создании переменной. ES5 §12.2
Где 10.5 шаг 8 является частью интереса
Ответ 4
Ответы парней верны. для вашего примера, однако стоит отметить, что country
- undefined
. как отмечают аспиляторы, ваш код ведет себя как ниже
var country;
var i;
country = "USA";
switch (country) {
case "USA":
country = i;
case "blach":
//not finished yet
}
i = 10;
alert(country) //undefined;
но когда ваш оператор case
запустился для "США", i
был undefined, поэтому это было присвоено country
. попробуйте здесь здесь fiddle.
Я предполагаю, что вам просто нужно знать, что хотя объявления переменных поднимаются, присваивания значений не являются.