有一种倾向认为你在 JavaScript 程序中看到的所有代码,在程序执行的过程中都是从上到下一行一行地被解释执行的。虽然这大致上是对的,但是这种猜测中的一个部分可能会导致你错误地考虑你的程序。
考虑这段代码:
a = 2;
var a;
console.log( a );
你觉得在 console.log(..)
语句中会打印出什么?
许多开发者会期望 undefined
,因为语句 var a
出现在 a = 2
之后,这很自然地看起来像是这个变量被重定义了,并因此被赋予了默认的 undefined
。然而,输出将是 2
。
考虑另一个代码段:
console.log( a );
var a = 2;
你可能会被诱导而这样认为:因为上一个代码段展示了一种看起来不是从上到下的行为,也许在这个代码段中,也会打印 2
。另一些人认为,因为变量 a
在它被声明之前就被使用了,所以这一定会导致一个 ReferenceError
被抛出。
不幸的是,两种猜测都不正确。输出是 undefined
。
那么。这里发生了什么? 看起来我们遇到了一个先有鸡还是先有蛋的问题。哪一个先有?声明(“蛋”),还是赋值(“鸡”)?