开发者社区 问答 正文

window.foo不会报错。foo就会报错

一个没有定义的foo变量

typeof foo => undefined
window.foo => undefined

foo => foo is not define

为什么呢?直接使用foo就会提示没定义

展开
收起
杨冬芳 2016-06-08 15:36:52 1760 分享 版权
1 条回答
写回答
取消 提交回答
  • IT从业
     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",而不会抛异常。

    1. window.foo

    这是一个属性访问表达式。

    11.2.1 Property Accessors

    可以看出,它是被等价为为window['a']来计算的,即a被作为字符串"a",而不是一个标识符。在此过程中不会抛异常。

    1. 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步。

    2019-07-17 19:32:05
    赞同 展开评论
问答地址: