JavaScript:未定义的值赋值 案例1
假设我有:JavaScript:未定义的值赋值 案例1,javascript,Javascript,假设我有: a = {} a.x // would return "undefined" 但是我可以 b = a.x 控制台将只返回一个未定义的 案例2 但是,如果我有: a // would throw an error saying "ReferenceError: a is not defined" 而我不能 b = a // console throws tantrum insisting "ReferenceError: a is
a = {}
a.x // would return "undefined"
但是我可以
b = a.x
控制台将只返回一个未定义的
案例2
但是,如果我有:
a // would throw an error saying "ReferenceError: a is not defined"
而我不能
b = a // console throws tantrum insisting "ReferenceError: a is not defined"
问题
有什么区别?毕竟,两者都是未定义的。为什么第一个没有抛出错误?为了让我自己更清楚:
╭────────────────────┬────────────────────────┬───────────────────────╮
| Resolution | Property Resolution | Variable Resolution |
╞════════════════════╪════════════════════════╪═══════════════════════╡
| Subjective | Objects | LexicalEnvironment |
|────────────────────|────────────────────────|───────────────────────|
| Rule of Procession | Follow Prototype Chain | Follow Scope Chain |
└────────────────────┴────────────────────────┴───────────────────────┘
多亏了@RobG。引用他提供的有用信息:
本规范中使用了两种环境记录值:声明性环境记录和对象环境记录。声明性环境记录用于定义ECMAScript语言语法元素的效果,如FunctionDeclarations、VariableDeclarations和Catch子句,它们直接将标识符绑定与ECMAScript语言值关联。对象环境记录用于定义ECMAScript元素(如Program和WithStatement)的效果,这些元素将标识符绑定与某些对象的属性相关联
因为属性访问不同于引用范围中的变量。要首先检查是否存在,您需要执行
if(typeof a!=“undefined”)
,但这种情况很少见。未声明的变量与未定义的值不同。这两个注释都是真的。最后,口译员只是试图通过指出哪些地方出了问题来提供帮助。但是您的代码在两种情况下都是相同的。@p.s.w.g所以对象的“未定义”属性默认为undefined
。默认情况下为什么不未声明的?@Lucia——“未定义”对象的属性是“未定义的”,即它们不存在。但是,当尝试访问不存在的属性时,将返回值undefined。相反,当尝试访问未定义的变量时,会引发引用错误。您已经发现了沿[[Prototype]]
链进行的对象上的属性解析与沿范围链进行的对象上的变量解析之间的差异。