2015-01-26 2 views
0

JavaScript documentation насыщает:Переменная JavaScript Подъемный без функций

Еще одна необычная вещь о переменных в JavaScript является то, что вы можете обратиться к переменной, объявленной позже, не получив исключение. Эта концепция называется подъемом; переменные в JavaScript в некотором смысле «подняты» или подняты до вершины функции или оператора. Однако переменные, которые еще не инициализированы, возвращают значение неопределенного.

Сейчас в моем коде (на самом деле это фрагмент кода из W3Schools на ту же тему) я не использую функции:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>JavaScript index</title> 
</head> 
<body> 

<p id="demo"></p> 

<script> 
    x = 5; // Assign 5 to x 

    elem = document.getElementById("demo"); // Find an element 
    elem.innerHTML = x;      // Display x in the element 

    var x; // Declare x 

    alert(x); 
</script> 

</body> 
</html> 

Результат alert() 5. Почему не undefined. По моему мнению, линия var x должна быть поднята вверх, а alert() должна отображать undefined.

Я прочитал еще немного об этом от: http://code.tutsplus.com/tutorials/javascript-hoisting-explained--net-15092

Что я не получаю?

+2

«var x следует поднимать вверх» --- и затем инициализируется '5' – zerkms

+0

Что заставляет вас думать, что' alert() 'будет показывать' undefined'? Я не следую вашим рассуждениям. – Pointy

+0

_ «Я назначаю значение переменной - и тогда мне интересно, что позже это значение ...» _ - серьезно? – CBroe

ответ

3

Ваш var x заявление is Поднят наверх. Поэтому назначение x происходит после его объявления и доalert().

Пример кода в связанном ссылки, которые могут быть бросание тебя это:

var myvar = 'my value'; 

(function() { 
    alert(myvar); // undefined 
    var myvar = 'local value'; 
})(); 

Этот пример отличается от вашего в этом существенным образом: инициализация переменной вовлеченного происходит послеalert() , не раньше, чем. Когда объявляется объявление var, единственной частью, которая была поднята, является сама декларация, а не инициализация. Эта маленькая функция выше интерпретируется как если бы оно было написано:

var myvar = 'my value'; 

(function() { 
    var myvar; 
    alert(myvar); // undefined 
    myvar = 'local value'; 
})(); 

Ваш код имеет x = 5 прямо в верхней части, так что это не та же самая ситуация.

+0

Не происходит ли инициализация раньше? В вашем первом абзаце говорится: «Поэтому присваивание x происходит после его объявления и перед предупреждением().« Но тогда вы указываете: «инициализация задействуемой переменной происходит после предупреждения(), а не раньше». отбрасывает меня. –

+0

@samyismyhero: Pointy говорит о двух разных примерах.В * вашем * примере назначение происходит до «предупреждения», в * его * примере назначение происходит после «предупреждения». Также обратите внимание, что несколько переменных * деклараций * не влияют друг на друга. Как только переменная объявлена, дальнейшие объявления игнорируются. То есть 'var foo = 3; var foo = 5; 'равнозначно' var foo; foo = 3; foo = 5' и 'var foo = 3; var foo; 'эквивалентно' var foo; foo = 3; '. –

+0

О, мой плохой. Ты прав. –

Смежные вопросы