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 - 滚动时动画不起作用 - JQuery

javascript - 表单提交按钮值

javascript - :not isn't working

swift - 初始化前被闭包捕获的变量

javascript - 为什么在 JavaScript class A instanceof Function 中,class A 的 typeof 不是对象?

javascript - 这个 JavaScript 模式叫什么?为什么使用它?

recursion - 如何在 Go 中递归闭包?

closures - common lisp 中的局部动态绑定(bind)

javascript - 对于异步内部函数,外部函数的函数参数是否会发生变化?