当我运行此代码时,我收到 TypeError,因为 this.coverageList
未定义。我怀疑这与我看不到的关闭问题有关。方法 this.accumulateCoverage
被传递给 Array
实例的 forEach()
方法。
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);
}
最佳答案
forEach
应该将上下文作为第二个参数:
genomicInterval.features.forEach(this.accumulateCoverage, this);
但这可能取决于您是否使用polyfill。对 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);
}
这不需要像第一个解决方案那样传递上下文。
关于JavaScript 闭包。为什么我的 "this"在这个方法中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22385736/