JavaScript 闭包。为什么我的 "this"在这个方法中未定义

标签 javascript closures

当我运行此代码时,我收到 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/

相关文章:

javascript - 点击事件时图像消失的问题 (javascript)

php - 如何检查 YouTube channel 名称是否存在?

javascript - 遍历 DOM 以选择特定的 child 进行 e2e 测试

JavaScript 反射

javascript - 我的闭包示例没有像我想的那样工作

javascript - 如何在严格模式下实现以下 JavaScript 闭包?

javascript - 双击而不是单击的动画

javascript - 现代 Javascript 中的闭包 VS 类

swift - 关于 swift 3 中的速记参数。Swift 的新功能

javascript - Promise 函数中的 Promise : Can't push data into Array