Javascript 把这件事结束

Javascript 把这件事结束,javascript,closures,Javascript,Closures,我正在使用javascript模块模式,并将所有函数作为对象成员返回,我正在尝试使用d3为更改处理程序添加一个闭包,但这超出了我用于处理程序的闭包的范围,我不确定如何将其放入范围。所以我的模块看起来像: var myMod = (function() { return { onChangeHandler: function(x, y) { // handle event }, createSelect: funct

我正在使用javascript模块模式,并将所有函数作为对象成员返回,我正在尝试使用d3为更改处理程序添加一个闭包,但这超出了我用于处理程序的闭包的范围,我不确定如何将其放入范围。所以我的模块看起来像:

var myMod = (function() {
    return {
        onChangeHandler: function(x, y) {
            // handle event
        },

        createSelect: function(columnName) {
            // create the select form element as categorySelect using d3

            // add event handler using d3 api

            // this version works, but the d3 arguments aren't the ones I want
            categorySelect.on("change, this.onChangeHandler);

            // so this is what I actually want
            categorySelect.on("change", function() {
                // but this gives an error
                this.onChangeHandler(columnName);
            });
        }
    };
})();
我在第二个版本中遇到的错误是:

TypeError:this.categoryFieldChanged不是函数


所以我想我需要把它传递到闭包中,但是我不能控制传递到闭包中的参数,所以我怎么才能避免这个问题呢?

当然,我只是把它全部输入了才算出来。但要分享答案:

我可以将其存储在外部函数范围内的一个变量中,该函数在闭包内可用。例如:

    createSelect: function(columnName) {
        // create the select form element as categorySelect using d3

        // add event handler using d3 api
        var moduleThis = this;
        categorySelect.on("change", function() {
            // but this gives an error
            moduleThis.onChangeHandler(columnName);
        });
    }
我还发现闭包中的这个引用了select,所以我可以使用this.value获得新选择的值