2014-03-13 28 views
1

當我運行這段代碼時,我得到一個TypeError,因爲this.coverageList未定義。我懷疑這與我看不到的關閉問題有關。方法this.accumulateCoverage傳遞給Array實例的forEach()方法。Javascript關閉。爲什麼我的「this」在這個方法中未定義

igv.Coverage = function (genomicInterval) { 

    this.accumulateCoverage = function (alignment) { 

     var i, j, blocksBBoxLength; 

     if (!this.coverageList) { 

      this.coverageList = new Array(genomicInterval.end - genomicInterval.start); 

      for (i = 0; i < this.coverageList.length; i++) { 
       this.coverageList[ i ] = 0; 
      } 

     } 

    }; 

    genomicInterval.features.forEach(this.accumulateCoverage); 

} 

回答

1

forEach應採取情境作爲第二個參數:

genomicInterval.features.forEach(this.accumulateCoverage, this); 

但這可能取決於您正在使用填充工具。對forEach的支持相對較新,可能在所有瀏覽器中都不支持。

問題是,當你傳遞一個函數引用時,它會失去與它所屬的對象的關聯。這只是一個功能。只有當您使用object.method()語法調用函數時,函數纔會收到隱含的this參數(分配給object)。這就是爲什麼作爲輸入和執行另一個函數的函數通常會允許您提供應該傳遞的對象,如this

可能適合您的目的的替代模式是將this分配給您的函數之外的局部變量,以便它包含在函數閉包中。

igv.Coverage = function (genomicInterval) { 
    var me = this;  
    function accumulateCoverage(alignment) { 
     var i, j, blocksBBoxLength; 

     if (!me.coverageList) { 
      //... 
     } 
    }; 

    genomicInterval.features.forEach(accumulateCoverage); 
} 

這否定了需要通過周圍環境一樣的首選解決方案。

+0

是的,使用局部變量賦值 - me = this - 將封閉中包含的「this」包含在我之後。謝謝馬克。乾杯。 – dugla

相關問題