作用域链首先查找 __parent__ 还是 __proto__?
Scope chain first looks to __parent__ or to __proto__?
Here 我发现了工作范围链的热门信息:
...before we go to the parent link, first proto chain is
considered.
Notice, that not in all implementations the global object inherits
from the Object.prototype. The behavior described on the figure (with
referencing “non-defined” variable x from the global context) may be
tested e.g. in 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
您应该引用该段的开头,而不是结尾:
At code execution, a scope chain may be augmented using with
statement and catch
clause objects.
所以你这句话所指的只是对象环境记录——变量所在的作用域对象。这些通常是虚构的,仅出于规范目的进行描述(并且可以 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
}
When I set global variable x
, and set Object.prototype.x
property, why doesn't it get the prototype value?
通过在直接调用 (a()
) 的函数中使用 this
,您指的是全局对象。它确实是全局范围的对象环境记录的对象,这意味着所有全局变量都作为属性存在。
现在为什么访问该对象的 x
(无论是通过变量 x
还是 属性 this.x
)显示 1
而不是 2
?因为值为 1
的全局变量是对象的 own 属性。只有在 属性 还没有找到的情况下才会遍历原型链!
Here 我发现了工作范围链的热门信息:
...before we go to the parent link, first proto chain is considered.
Notice, that not in all implementations the global object inherits from the Object.prototype. The behavior described on the figure (with referencing “non-defined” variable x from the global context) may be tested e.g. in 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
您应该引用该段的开头,而不是结尾:
At code execution, a scope chain may be augmented using
with
statement andcatch
clause objects.
所以你这句话所指的只是对象环境记录——变量所在的作用域对象。这些通常是虚构的,仅出于规范目的进行描述(并且可以 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
}
When I set global variable
x
, and setObject.prototype.x
property, why doesn't it get the prototype value?
通过在直接调用 (a()
) 的函数中使用 this
,您指的是全局对象。它确实是全局范围的对象环境记录的对象,这意味着所有全局变量都作为属性存在。
现在为什么访问该对象的 x
(无论是通过变量 x
还是 属性 this.x
)显示 1
而不是 2
?因为值为 1
的全局变量是对象的 own 属性。只有在 属性 还没有找到的情况下才会遍历原型链!