如何确保"this"是指对象文本中的对象文本?



这是一个简单的小提琴

我想确保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() },
}      

EDIT下面的工作,但它是混乱的。有没有更优雅的方式?

我最终改变了

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]);

我不知道为什么还没有建议使用bind:

var obj = {};
obj.b = (function () {
    // "this" will always be "obj"
}).bind(obj);
参考:

  • https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind

无论何时调用foo.bar(), this的值将被设置为foo。所以我看不出你的代码有什么问题。

但是,当您间接调用方法时,如

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

全局对象变为this。也许这就是你的遭遇?

强制this,使用callapply:

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

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

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

在本例中,第一个参数是要调用的函数,第二个参数是上下文。

这里是更新后的提琴

最新更新