Подтвердить что ты не робот

В 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;

Это действительно? Это разрешено? И если да, то каков технический термин для этого?

4b9b3361

Ответ 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.

Я предполагаю, что вам просто нужно знать, что хотя объявления переменных поднимаются, присваивания значений не являются.