现在对我来说这是一个新的。我四处搜索,但在其他地方找不到解决方案。
我有这个代码(coffeescript):
PositionDetector = ->
detectPosition : ->
console.log this # outputs 'Object' (OK)
navigator.geolocation.getCurrentPosition(this.locationHandler)
locationHandler : (position) ->
console.log this # outputs 'Window' (WHY??)
positionDetector = new PositionDetector()
positionDetector.detectPosition()
(或相应的已编译的javascript,如果您愿意):
var PositionDetector = function() {
detectPosition : function() {
console.log(this); // outputs 'Object'
navigator.geolocation.getCurrentPosition(this.locationHandler);
},
locationHandler : function(position) {
console.log(this); // outputs 'Window'
}
}
var positionDetector = new PositionDetector();
positionDetector.detectPosition();
问题是,为什么第一个'this'输出'Object'而第二''输出'Window'?
答案 0 :(得分:3)
因为this
取决于来电者。 this.locationHandler
的来电者是navigator.geolocation.getCurrentPosition(callback)
,它会调用callback()
这样的函数,请注意,该调用中没有点,这意味着this
没有值。解决方案是使用this
永久设置bind
:
navigator.geolocation.getCurrentPosition(this.locationHandler.bind(this))
请记住,一般规则:没有点,没有this
,除非您使用call
或apply
来调用该函数,或bind
来设置this
的值1}}永远。
答案 1 :(得分:0)
T.J.克劳德& elclanrs是对的。
作为简要说明: “this”指的是对象上下文(A.K.A.范围),它不能完全按照您在javascript中的预期工作,
恕我直言这种情况使Javascript变得愚蠢。 有两种方法可以克服这种影响。首先是他们已经展示的“绑定”方法。第二个是神奇的“封闭”一代。