有关于js中的ReferenceError问题,在《你不知道的Javascript》一书的第一章中有提到:
如果RHS查询在所有嵌套的作用域中遍寻不到所需的变量,引擎就会抛出 ReferenceError 异常。
那请问,下面的两个例子有啥区别呢?两者都是因为在作用域中找不到所需的变量,但为啥一个是undefined,一个是ReferenceError。
<script>
console.log(window.a); // undefined
console.log(a); // ReferenceError异常
</script>
這就是變量提升(即在es5標準下,在定義之前調用變量,會出現變量提升undefined),由於在es5裡面只有全局作用域和函數作用域,在瀏覽器環境裡面你的a和window.a是等價的,這樣寫都是undefined.
Ps:Es6有塊作用域,使用let代替var,可以解決這種困擾了
第一行代码里的a是作为window的property引用的,不会报错,事实上查询window上的任何property(不管property是否真的存在window上)都不会报错.
第二行代码里的a相当于global varibal, 使用之前必须要声明(declaration),否则会报错。