2013-10-20 207 views
1

這是PhoneGap應用程序,但我認爲這是無關緊要的。因此,這裏是我使用的代碼:JavaScript原型函數調用

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。爲什麼會發生?

回答

2

因爲this.onError未被正確的上下文調用。您可以嘗試Function.bind()

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

同樣爲onSuccess

+0

這是正確答案!我會很快標記它。謝謝!它有什麼「副作用」? –

+1

不,除了某些瀏覽器需要'Function.prototype的填充。綁定「(如IE8-)。你會在這裏找到更多的信息和代碼:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind – David

0

this.onError正在另一個環境中運行。它在navigator.geolocation的環境中運行。

如果你想在上下文中運行this.onError地理位置,你必須使用一個像這樣的代理方法:

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

用法:

proxy(this.onError, this) 

爲例看這個:

http://jsfiddle.net/Z32BZ/

有一個愉快的一天:-)

1

除了這個事實,成功拼錯了,有沒有辦法肯定呢。

JavaScript使用「this」的棘手問題是,「this」不是由方法的定義決定的,而是由它的調用方式決定的。

How the "this" affected in a method's method?

例如,我可以定義指向你的函數變量:

我在另一個類似的問題最近解釋這個

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」沒有定義。

你可以做的是通過它具有封閉參考回到你的地理位置對象的包裝/代理功能,因此它可以調用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 
     }); 
}