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