跨脚本标记提升变量声明?

时间:2018-02-17 06:39:18

标签: javascript

我将以下代码插入到html文件中:



<script>
	console.log(myVar);
	var myVar = 1;
</script>
&#13;
&#13;
&#13;

在浏览器中打开此html页面后,myVar的值将是未定义的。 据我所知,这是javascript中的正常行为,因为它首先设置 内存空间然后它执行代码。

现在奇怪的部分是,如果我们将此分割为同一个html页面:

&#13;
&#13;
<script>
	console.log(myVar);
</script>

<script>
	var myVar = 1;
</script>
&#13;
&#13;
&#13;

结果将是:未捕获的ReferenceError:未定义myVar

为什么?

这不是关于变量的范围,而是关于提升,似乎提升仅在javascript块内,并且不适用于其他javascript块中的整个加载页面。这里的例子相同:

&#13;
&#13;
<script>
	myFunc();

  function myFunc() {
		console.log('Hello!');
	}
</script>

VS

<script>
	myFunc();
</script>


<script>
	function myFunc() {
		console.log('Hello!');
	}
</script>
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:2)

在上面的代码中,<script>首先呈现console.log(myVar),系统在全局和本地范围内查找myVar变量。因为,在此点之前找不到该变量,所以Uncaught ReferenceError: myVar is not defined错误会在下一个var myVar = 1;块中呈现<script>错误。

&#13;
&#13;
<script>
  console.log(myVar);
</script>

<script>
  var myVar = 1;
</script>
&#13;
&#13;
&#13;

但是,当您将<script>块的顺序更改为类似下面的内容时,它将起作用

&#13;
&#13;
<script>
  var myVar = 1;
</script>

<script>
   console.log(myVar);
</script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

MyVar现在在第二个示例的范围内定义(即使它可能在示例1中)。在最后一段代码中,声明了myVar。 我高兴地推荐阅读JavaScript(和Java)中的变量范围

答案 2 :(得分:0)

为什么呢?因为第一个脚本运行时不考虑第二个脚本。您描述的行为,在执行代码之前首先声明所有变量,仅适用于每个单独的代码块。