JavaScript无函数变量提升

JavaScript Variable hoisting without functions

JavaScript documentation 表示:

Another unusual thing about variables in JavaScript is that you can refer to a variable declared later, without getting an exception. This concept is known as hoisting; variables in JavaScript are in a sense "hoisted" or lifted to the top of the function or statement. However, variables that aren't initialized yet will return a value of undefined.

现在在我的代码中(实际上它是来自 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

我没有得到什么?

您的 var x 语句 提升到顶部。因此,对 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 位于顶部,因此情况不同。