为什么:
if(x)
alert('Available');
给出:ReferenceError: x is not defined
虽然这有效:
if(window.x)
alert('Available');
不是说:
var x = "";
相当于:
x = "";
相当于:
window.x = "";
只要外部一个函数,因为整个代码都被with(window)
包围?
为了更清楚:我确实知道全局变量和成员变量之间的区别,但我想知道为什么检索未声明的变量会产生像x;
这样的ReferenceError而window.x
给出未定义的?难道他们都不应该未定义?
答案 0 :(得分:5)
window.x
“工作原因”(但不应满足if
条件)的原因是因为在访问对象的不存在属性时,返回undefined,而不是异常。直接访问变量的情况恰恰相反。这很可能是因为如果在定义变量之前访问它,那么程序可能会有一个不应该被忽视的错误。
此外,var
定义了一个只能在封闭范围内访问的变量。省略关键字会导致创建全局变量。
答案 1 :(得分:0)
x
可以是三个不同的东西,它可以是全局变量,局部变量或window
对象中的属性。
如果在任何函数之外使用var x = "";
,它将是一个全局变量。如果x = "";
用于x
尚未定义的任何位置,则它将是一个全局变量。
如果在函数内使用var x = "";
,它将是一个局部变量。
使用window.x = "";
将在window
对象中创建一个属性。
获取未定义的变量的值是一个错误。获取未定义的属性的值不是错误,并返回值undefined
。