【发布时间】:2013-05-05 06:56:57
【问题描述】:
我有这个简单的代码:
var o = {
a: 1,
b: 2,
f1: function ()
{
alert(this.b);
}
}
var o2 = {
a: 11,
b: 22,
f2: function (j)
{
j();
}
}
但是运行这段代码:
o2.f2(o.f1) 产生未定义。 (虽然我期待“22”作为结果)
现在,我知道上下文已经到了某个地方。因此,如果我将o2 中的代码更改为:
f2: function (j)
{
j.apply(this);
}
它确实有效。
但我的问题是:
- 我在什么阶段失去了上下文?
我不明白:当j() 运行时,o2 对象中有一个 b 属性。
我错过了什么?
【问题讨论】:
-
当您将其称为
f()- JavaScript 方法是“未绑定函数”(也就是说,与其他语言中的方法不同,它们是非与特定对象/实例相关联),它是在调用时确定this的调用站点。 (当然,请参阅Function.bind或等效仿真。) -
你一经过
o.f1就会丢失它。如果您执行var x = o.f1并调用x(),则f1不再绑定。 -
@Blender 我知道。但为什么
this不涉及o2?这是我不明白的 -
@RoyiNamir
f()大致相当于window.f = f; window.f()在它如何影响被调用函数内的this方面。 Here are the gory details. -
@RoyiNamir:为什么要这样做?它是不受约束的。调用它不会神奇地将它绑定到当前上下文。
标签: javascript