JavaScript:未定义的值赋值

时间:2014-09-22 01:53:07

标签: javascript

<案例1

说我有:

a = {}
a.x         // would return "undefined"

但是我可以

b = a.x

控制台只返回undefined

<案例2

但是,如果我有:

a           // would throw an error saying "ReferenceError: a is not defined"

我不能拥有

b = a       // console throws tantrum insisting "ReferenceError: a is not defined"

问题

有什么区别?毕竟两者都是undefined。为什么第一个没有抛出错误?

1 个答案:

答案 0 :(得分:0)

为了让自己更清楚:

╭────────────────────┬────────────────────────┬───────────────────────╮
| Resolution         | Property Resolution    | Variable Resolution   |
╞════════════════════╪════════════════════════╪═══════════════════════╡
| Subjective         | Objects                | LexicalEnvironment    |
|────────────────────|────────────────────────|───────────────────────|
| Rule of Procession | Follow Prototype Chain | Follow Scope Chain    |
└────────────────────┴────────────────────────┴───────────────────────┘

感谢@RobG。引用他提供的有用的link

  

本规范中使用了两种环境记录值:声明性环境记录和对象环境记录。声明性环境记录用于定义ECMAScript语言语法元素的效果,例如FunctionDeclarations,VariableDeclarations和Catch子句,它们直接将标识符绑定与ECMAScript语言值相关联。对象环境记录用于定义ECMAScript元素的效果,例如Program和WithStatement,它们将标识符绑定与某个对象的属性相关联。