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/