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