1

这是PhoneGap 应用程序,但我认为这里无关紧要。所以这是我正在使用的代码:

function Geolocation(){

    this.maximumAge = 3000;
    this.timeout = 20;
    this.enableHighAccuracy = true
    this.geolocation = navigator.geolocation.getCurrentPosition(this.onSucess, this.onError, {maximumAge : this.maximumAge, timeout : this.timeout, enableHighAccuracy: this.enableHighAccuracy});
}

Geolocation.prototype.onSucess = function(position){
}

Geolocation.prototype.onError = function(error){
    alert( typeof this.onSucess );
}

并且每当触发 onError 时,此警报都会返回undefined。为什么会这样?

4

3 回答 3

2

因为this.onError没有在正确的上下文中调用。你可以试试Function.bind()

navigator.geolocation.getCurrentPosition(
    this.onSucess.bind(this), 
    this.onError.bind(this),
    //...

也是如此onSuccess

于 2013-10-20T14:28:49.833 回答
1

除了成功拼写错误的事实之外,还没有办法确定。

JavaScript 使用“this”的棘手之处在于“this”不是由方法的定义决定的,而是由它的调用方式决定的。

我最近在另一个类似的问题中解释了这一点:

“this”如何影响方法的方法?

例如,我可以定义一个指向您的函数的变量:

var blah = this.onSucess;
blah();  // "this" will be undefined

var bleh = {
  test: this.onSuccess
}
bleh.test();  // "this" will be the object literal.

当 getCurrentPosition 调用你的回调函数时,它可能只是直接调用它:

onSuccess(position);

因此没有定义“this”。

你可以做的是传递给它一个包装器/代理函数,该函数有一个闭包引用回到你的 Geolocation 对象,所以它可以调用 this.onSuccess:

function Geolocation(){
    this.maximumAge = 3000;
    this.timeout = 20;
    this.enableHighAccuracy = true
    this.geolocation = navigator.geolocation.getCurrentPosition(function (position) {
          this.onSucess(position);
      },
      function (error) {
          this.onError(error);
      },
      {
       maximumAge : this.maximumAge,
       timeout : this.timeout,
       enableHighAccuracy: this.enableHighAccuracy
      });
}

正如 David 所展示的那样,一种简便的方法是使用 Function.bind,它返回一个包装函数,就像我描述的那样:

function Geolocation(){
    this.maximumAge = 3000;
    this.timeout = 20;
    this.enableHighAccuracy = true
    this.geolocation = navigator.geolocation.getCurrentPosition(this.onSucess.bind(this),
      this.onError.bind(this),
      {
       maximumAge : this.maximumAge,
       timeout : this.timeout,
       enableHighAccuracy: this.enableHighAccuracy
      });
}
于 2013-10-20T14:39:13.770 回答
0

this.onError在另一个上下文中运行。它在navigator.geolocation的上下文中运行。

如果要在Geolocation上下文中运行this.onError,则必须使用如下代理方法:

proxy = function(func, context) {
     func.apply(context);   
}

用法:

proxy(this.onError, this)

例如看到这个:

http://jsfiddle.net/Z32BZ/

祝你今天过得愉快 :-)

于 2013-10-20T14:32:25.840 回答