为什么读取未声明的变量会产生引用错误,但未声明的对象属性在javascript中返回undefined?

时间:2017-08-05 10:06:33

标签: javascript this javascript-objects

在下面的代码中,如果我在控制台上打印this.property2,JS引擎打印undefined,如果我替换语句只打印property2编译器 抛出引用错误。如果我声明变量property2,那么编译器将返回undefined。

function foo() {
  var property;
  console.log(this.property2)
  console.log(this.property2 === property2)
  console.log(property2)
}

foo.property="property value";
var property2; // modified to resolve reference error
foo();
console.log(foo.property);

正如我在代码中所示,this.property2等于property2,所以为什么javascript对同一个变量的行为不同。

来我的问题是两个变量(this.property2和property2)有什么不同?如果是,那么为什么比较会返回true? 如果不是,那么为什么我必须声明property2来获取返回值,而this.property2返回的值没有 声明。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

  

为什么读取未声明的变量会产生引用错误,但未声明的对象属性在javascript中返回undefined?

这真的归结为:因为Brendan Eich决定在设计这些东西时应该做些什么。但我们可以看出他可能做出这些选择的一些原因:

在第一种情况下,您有一个完全未知的标识符。在第二种情况下,有上下文:我们知道我们正在寻找对象属性。另请注意,我们可以分配给未知属性而不会出错(这样做会创建属性;这是一件好事,因为很长一段时间它是创建属性的唯一方法[如果我们松散地将对象初始值设定项中的属性初始值设定项作为排序的赋值];现在我们将Object.defineProperty [赋值作为过程的一部分]及其复数表亲和相关的第二个参数{{1} }),它可以平衡很好的平衡,能够无错误地读取未知属性。

他当然可以从一个对象中读取一个未知属性是一个错误,他只是没有;并且现在没有改变它。 : - )

请注意,他早期将分配指向未知标识符,这是一种创建全局变量的机制。 (!)谢天谢地,那个是严格的模式。

附注:您不会声明属性,而是创建它们。只有函数,类(实际上是函数)和变量声明