如何确保'this'指向对象文字中的对象文字?

时间:2013-05-13 04:11:57

标签: javascript

这是一个简单的fiddle

我想确保this内的objobj,以便我可以从a致电b。我在另一个函数中使用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]);

3 个答案:

答案 0 :(得分:1)

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

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

参考:

答案 1 :(得分:0)

每当您致电foo.bar()时,this值都会设为foo。所以我认为您的代码没有任何问题。

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

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

全局对象变为this。也许这就是你发生的事情?

要强制某个this,请使用callapply

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

答案 2 :(得分:0)

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

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

在这种情况下,第一个参数是您要调用的函数,第二个参数是上下文。

以下是Fiddle updated