Here我发现热点信息适用于工作范围链:


  ...在转到父链接之前,第一个原型链是
  考虑过的。
  
  注意,并不是在所有实现中全局对象都继承
  来自Object.prototype。图中描述的行为(带有
  从全局上下文引用“未定义”变量x可能是
  经过测试在SpiderMonkey中。


我使用Firefox浏览器进行测试,但是,当我设置全局变量x并将其设置为Object.prototype属性x并执行a()时,我却有4。为什么,如果首先进入proto

var x = 1;
Object.prototype.x = 2;

var a = function () {
  y = 3;
  return this.y + this.x;
};

a.x;  // 2
a();  // 4

最佳答案

您应该引用该段的开头,而不是结尾:


  在代码执行时,可以使用with语句和catch子句对象来扩展作用域链。


因此,您的句子仅指对象环境记录-变量所在的作用域对象。这些通常是虚构的,仅出于规范目的进行描述(并且可以only be observed in Rhino),但是with语句会产生异常,并将实际的JS对象添加到作用域链中。

如果您查看该示例,则会在此处找到with语句。要点:

Object.prototype.x = "inherited object property";
var x = "parent scope variable";
with ({}) {
    alert(x); // you bet what it yields
}





  当我设置全局变量x并设置Object.prototype.x属性时,为什么它没有获得原型值?


通过在通常被称为(this)的函数中使用a(),就可以引用全局对象。它确实是全局范围的对象环境记录的对象,这意味着所有全局变量都作为属性存在于此。

现在为什么访问该对象上的x(无论是通过变量x还是通过属性this.x)都显示1而不显示2?因为值为1的全局变量是对象的自身属性。如果尚未找到该属性,则将遍历原型链!

关于javascript - 范围链首先看起来是__parent__还是__proto__?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30318025/

10-12 00:46
查看更多