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

use*_*065 4 javascript global-variables

为什么这个:

if(x)
  alert('Available');
Run Code Online (Sandbox Code Playgroud)

得到: ReferenceError: x is not defined

虽然这有效:

if(window.x)
   alert('Available');
Run Code Online (Sandbox Code Playgroud)

不是说:

var x = "";
Run Code Online (Sandbox Code Playgroud)

相当于:

x = "";
Run Code Online (Sandbox Code Playgroud)

相当于:

window.x = "";
Run Code Online (Sandbox Code Playgroud)

只要一个函数外面,整个代码被一个包围着with(window)



为了更清楚:我知道VS成员变量全球性的区别,但我想知道为什么检索未声明的变量提供类似的ReferenceError x;同时window.x给出了不确定的?他们不应该给undefined?

itd*_*ork 5

之所以window.x"工程"(但不应该满足的if条件),是因为访问对象的不存在的属性时,则返回undefined,而不是例外.直接访问变量的情况恰恰相反.这很可能是因为如果在定义变量之前访问变量,则程序可能存在不应忽视的错误.

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