把它传递给一个封闭物

时间:2014-08-06 11:35:29

标签: javascript closures

我正在使用javascript模块模式,并将所有函数作为对象成员返回,并且我正在尝试使用d3为on change处理程序添加闭包,但这不在闭包中的范围我是用于处理程序,我不知道如何把它放在范围内。所以我的模块看起来像:

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不是函数

所以我认为我需要将this传递给闭包,但是我不控制传递给闭包的参数,所以我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

只是把它全部输入(当然)。但是要分享答案:

我可以将this存储在外部函数范围内的变量中, 然后在闭包内可用。例如:

    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);
        });
    }

我还发现封闭内的this引用了select,因此我可以使用this.value获取新选择的值