一个没有定义的foo变量
typeof foo => undefined
window.foo => undefined
foo => foo is not define
为什么呢?直接使用foo就会提示没定义
PHPz2017-04-10 17:35:40
typeof foo
11.4.3 The typeof Operator
Let val be the result of evaluatingUnaryExpression.
If Type(val) is Reference, then
If IsUnresolvableReference(val) is true, return"undefined".
Let val be GetValue(val).
Return a String determined by Type(val) according to Table 20.
关键看2.a步骤,如果typeof
的操作数是一个不可解析的引用,那么会返回"undefined"
,而不会抛异常。
window.foo
这是一个属性访问表达式。
11.2.1 Property Accessors
可以看出,它是被等价为为window['a']
来计算的,即a
被作为字符串"a"
,而不是一个标识符。在此过程中不会抛异常。
foo
这是一个标识符。
10.3.1 Identifier Resolution
标识符解析过程稍显复杂,但最终结果是一个内部类型Reference类型。由于这个a
没有定义,所以Reference的base value是undefined
,表示这是一个不可解析的Reference。到这里还不会抛异常,但是对它进行求值时候,例如在控制台打印它(即执行console.log(a)
)时,就会抛异常了。见:8.7.1 GetValue第3步。
多说一点:为什么a
未定义时,对它进行赋值
a = 123;
不会出错(非严格模式下)呢?
因为,首先赋值时a
作为左值使用,不对它进行求值。然后,在非严格模式下,因为a
是一个不可解析的引用,它会被绑定到global对象(即window)上,成为一个全局变量。见:8.7.2 PutValue第3.b步。
巴扎黑2017-04-10 17:35:40
这里有三个概念:
对未定义的变量执行typeof会返回undefined
;因此始终建议定义变量时就为变量赋值,null
也行——不然你typeof返回undefined
你无法判断这个变量是未定义还是定义了未初始化赋值。
访问对象上不存在的属性会返回undefined
,和window变量没啥关系
直接访问未定义的变量会出错。
就这样。