Home  >  Q&A  >  body text

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

一个没有定义的foo变量

typeof foo => undefined
window.foo => undefined

foo => foo is not define

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

伊谢尔伦伊谢尔伦2683 days ago355

reply all(2)I'll reply

  • PHPz

    PHPz2017-04-10 17:35:40

    1. 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",而不会抛异常。

    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 = 123;

    不会出错(非严格模式下)呢?

    因为,首先赋值时a作为左值使用,不对它进行求值。然后,在非严格模式下,因为a是一个不可解析的引用,它会被绑定到global对象(即window)上,成为一个全局变量。见:8.7.2 PutValue第3.b步。

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:35:40

    这里有三个概念:

    1. 对未定义的变量执行typeof会返回undefined;因此始终建议定义变量时就为变量赋值,null也行——不然你typeof返回undefined你无法判断这个变量是未定义还是定义了未初始化赋值。

    2. 访问对象上不存在的属性会返回undefined,和window变量没啥关系

    3. 直接访问未定义的变量会出错。

    就这样。

    reply
    0
  • Cancelreply