先放代码:
if (asdf) {}
如上代码,如果没有定义 asdf 参数时,会执行报错,但是下面的代码就不会报错,这是为什么?他们有什么区别?
if (window.asdf) {}
补充下1楼的答案:
在js中,有个东西叫执行上下文,执行上下文中有个东西叫变量对象,保存着函数的形参、函数声明和声明的变量。其中有个点就是var显示声明的变量在代码执行前被包含到变量对象中,并赋予undefined,执行代码才对其进行填充值。
问题中:
if (asdf) {}
报错,是因为变量对象找不到asdf,即未声明也未赋值。而
window.asdf
相当于 asdf = undefined;(因为能被delete,所以不是var asdf = undefined)
所以执行if的时候为false,未报错
第一个
asdf
是一个未声明的变量第二个
window.asdf
的asdf
是windows
对象的属性,其值为undefined
js
中,不存在的属性,其值为 undefined
。
使用var定义变量,即使用
var asdf = 124;
和使用
asdf = 124;
window.asdf = 124;
是不同的,第一个方法定义的asdf属性不能使用delete,而第二种则是可以使用delete删除掉的属性。(不过很遗憾,使用eval定义的变量(第一种方式),依然可以使用delete删除)
猜测:
两种写法实际上语义的确是完全不同的,第一种写法,定义的是一个变量,访问的也是变量;而第二种,则是定义和访问属性。
似乎并没有回答题主的问题……