为什么if(x)与if(window.x)不一样?

时间:2014-07-28 23:21:26

标签: javascript global-variables

为什么:

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给出未定义的?难道他们都不应该未定义?

2 个答案:

答案 0 :(得分:5)

window.x“工作原因”(但不应满足if条件)的原因是因为在访问对象的不存在属性时,返回undefined,而不是异常。直接访问变量的情况恰恰相反。这很可能是因为如果在定义变量之前访问它,那么程序可能会有一个不应该被忽视的错误。

此外,var定义了一个只能在封闭范围内访问的变量。省略关键字会导致创建全局变量。

答案 1 :(得分:0)

x可以是三个不同的东西,它可以是全局变量,局部变量或window对象中的属性。

如果在任何函数之外使用var x = "";,它将是一个全局变量。如果x = "";用于x尚未定义的任何位置,则它将是一个全局变量。

如果在函数内使用var x = "";,它将是一个局部变量。

使用window.x = "";将在window对象中创建一个属性。

获取未定义的变量的值是一个错误。获取未定义的属性的值不是错误,并返回值undefined