这是一个简单的fiddle。
我想确保this
内的obj
为obj
,以便我可以从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]);
答案 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
,请使用call
或apply
:
qux.call(foo);
qux.apply(foo);
答案 2 :(得分:0)
从Jquery 1.4开始,您可以使用jQuery.proxy()并选择简单的特定上下文:
$('#hey').text( $.proxy(obj.b, obj) );
在这种情况下,第一个参数是您要调用的函数,第二个参数是上下文。