2011-07-11 13 views
1

這將在代碼中更好地解釋:使用原來`this`在事件觸發外

var FileResourceManager = { 
     LoadRequiredFiles: function (config) { 
      config = config || {}; 

      this.OnLoading = config.onLoadingCallback; 
      this.OnComplete = config.onCompleteCallback; 

      //this works fine here. 
      if (this.OnLoading) { 
       this.OnLoading(); 
      } 

      Modernizr.load([{ 
       load: 'somefile.js', 
       complete: function() { 
         //Error in this callback here. 
         if (this.OnComplete) { 
          this.OnComplete(); 
         } 
       } 
      }); 
     } 

    }; 
    FileResourceManager.LoadRequiredFiles({ 
     onLoadingCallback: function() { 
      alert('started'); 
     }, 
     onCompleteCallback: function() { 
      alert('complete'); 
     } 
    }); 

正如你所看到的,在回調Modernizr.load的complete事件,我想調用的方法父/外部對象。但this實際上成了Modernizr對象。我如何訪問事件內部的外部對象的屬性?

我已經在backbone.js項目中看到過這個,通過使用某種形式的綁定。我不確定是否需要寫這樣的東西。

回答

3
var self = this; 

Modernizr.load([{ 
      load: 'somefile.js', 
      complete: function() { 
        //Error in this callback here. 
        if (self.OnComplete) { 
         self.OnComplete(); 
        } 
      } 
     }); 
+0

此外,在一個地方你的代碼是指'OnCompleteCallback',而在另一方面,它指的是'OnComplete'。那些應該是同一件事嗎? –

1
Modernizr.load([{ 
      load: 'somefile.js', 
      complete: (function() { 
        //Error in this callback here. 
        if (this.OnComplete) { 
         this.OnComplete(); 
        }).bind(this) 
      } 
     }); 
0

在Modernizr的功能的範圍的重新定義的this對象。通常在範圍外定義一個名爲that的變量,並用它來指外部this

或者,你可以只使用config對象,像這樣:

complete: function() { 
    if (config.OnComplete) { 
    config.OnComplete();       
    } 
}