javascript - window.foo不会报错。foo就会报错
伊谢尔伦
伊谢尔伦 2017-04-10 17:33:40
[JavaScript讨论组]

一个没有定义的foo变量

typeof foo => undefined
window.foo => undefined

foo => foo is not define

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

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(2)
PHPz

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

巴扎黑

这里有三个概念:

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

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

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

就这样。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号