这是一个简单的小提琴
我想确保obj
中的this
是obj
,以便我可以从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
,使用call
或apply
:
qux.call(foo);
qux.apply(foo);
从Jquery 1.4开始,您可以使用Jquery .proxy()并选择一个特定的上下文:
$('#hey').text( $.proxy(obj.b, obj) );
在本例中,第一个参数是要调用的函数,第二个参数是上下文。
这里是更新后的提琴