如何确保'this'指的是对象字面量内部的对象字面量?

3

这里有一个简单的代码片段

我想确保obj内部的thisobj,以便我可以从b中调用a。我在另一个函数中使用了obj,当我在b中设置断点时,发现this是窗口,而不是obj

var obj = {
    a: function() { return 2 },
    b: function() { return 5+ this.a() },
}

$('#hey').text(obj.b());

obj在许多其他类中使用的文件中定义,因此在使用obj的地方定义任何一个方法都没有意义。

从@Kamil的答案来看,看起来我需要将a作为参数传递给b。 如下所示:

var user = obj.b(obj.a);

var obj = {
  a: function() { return 2 },
  b: function(func) { return 5 + func() },
}      
编辑 下面的方法可以实现,但是比较混乱。有更加优雅的方法吗?

最终我改变了

startingSMA = this.simple_moving_average(startingSMA, period, accessor)

翻译如下:

startingSMA = (function(startingSMA, period, accessor) {
                 return this.simple_moving_average(startingSMA, period, accessor)                  
              }).apply(Statistics, [startingSMA, period, accessor]);

当你在B中使用它时,此处仅为对象而非窗口。 - Prasath K
@PrasathK 在 OP 的代码中,this 指的是全局对象,而在 Web 浏览器中确实是 window - Paul
4
抱歉,我无法复现那个问题。您的代码没有问题,在这个示例中也没问题。 - user123444555621
2
在您的代码演示中,它是引用了 obj ,如何复制引用 window - Steely Wing
@Rose - 你的原始代码运行良好,达到了你的预期。请忽略我的回答和你可能看到的任何评论。 - Kamil Szot
你的代码有问题,但是具体哪里出了问题还不清楚。你提供的示例代码运行正常。请提供更明显出错的代码,因为无法诊断能够正常运行的代码。你在实际代码中遇到的问题,在这里并没有重现。 - apsillers
3个回答

1

0
无论何时您调用foo.bar()this值将被设置为foo。所以我不认为您的代码存在任何问题。

然而,当您间接调用方法时,例如

var qux = foo.bar;
qux(); // no dot-notation

全局对象变成了this。也许这就是你遇到的问题?

要强制指定一个this,可以使用callapply

qux.call(foo);
qux.apply(foo);

她的代码没有问题,只有在第二次运行时,obj变量已经设置好了。 - Kamil Szot
@KamilSzot - 你的“only the second time”是什么意思?OP的代码和这个答案都没有问题。 - nnnnnn

0

自Jquery 1.4以来,您可以使用jQuery.proxy()并选择一个特定的上下文:

$('#hey').text( $.proxy(obj.b, obj) );

在这种情况下,第一个参数是您想要调用的函数,第二个参数是上下文。
这里是更新后的Fiddle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接