一个没有定义的foo变量
typeof foo => undefined
window.foo => undefined
foo => foo is not define
为什么呢?直接使用foo就会提示没定义
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
typeof foo
11.4.3 The typeof Operator
1.Let val be the result of evaluatingUnaryExpression.
2.If Type(val) is Reference, then
1.If IsUnresolvableReference(val) is true, return"undefined".
2.Let val be GetValue(val).
3.Return a String determined by Type(val) according to Table 20.
关键看2.a步骤,如果typeof的操作数是一个不可解析的引用,那么会返回"undefined",而不会抛异常。
这是一个属性访问表达式。
11.2.1 Property Accessors
可以看出,它是被等价为为window['a']来计算的,即a被作为字符串"a",而不是一个标识符。在此过程中不会抛异常。
这是一个标识符。
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步。