JavaScript-在自调用函数中传递回调函数
我试图在JavaScript中的JavaScript-在自调用函数中传递回调函数,javascript,closures,self-invoking-function,Javascript,Closures,Self Invoking Function,我试图在JavaScript中的自调用函数中传递回调函数,但在执行完成函数时,我得到了“未定义”的结果 我读了下面的代码: function done() { console.log(dateFilter.getI()); console.log(dateFilter.getF()); } var dateFilter = (function(callback) { var _dInicio = new Date(), _d = new Date(),
自调用函数
中传递回调
函数,但在执行完成
函数时,我得到了“未定义”的结果
我读了下面的代码:
function done() {
console.log(dateFilter.getI());
console.log(dateFilter.getF());
}
var dateFilter = (function(callback) {
var _dInicio = new Date(), _d = new Date(),
_dFim = new Date(_d.setMonth(new Date().getMonth() - 1));
return {
getI: function() { return _dInicio; },
getF: function() { return _dFim; },
setI: function(d) { _dInicio = d; },
setF: function(d) { _dFim = d; }
}, callback();
})(done);
也许我用错了,但我认为这应该管用。有人可能会指出我在哪里误解了什么?您在
返回后调用done
函数,而且,您没有传递参数dateFilter
return { -> return before calling callback `function`.
getI: function() { return _dInicio; },
getF: function() { return _dFim; },
setI: function(d) { _dInicio = d; },
setF: function(d) { _dFim = d; }
}, callback( );
^
|_ Calling callback without param `dateFilter`
看看这个代码片段
函数完成(日期过滤器){
log(dateFilter.getI());
log(dateFilter.getF());
}
(函数(回调){
var_dInicio=新日期(),
_d=新日期(),
_dFim=新日期(_d.setMonth(新日期().getMonth()-1));
回拨({
getI:function(){
返回_dInicio;
},
getF:function(){
返回_dFim;
},
setI:功能(d){
_dInicio=d;
},
setF:功能(d){
_dFim=d;
}
});
})(完成)
您在返回后调用done
函数,而且,您没有传递参数dateFilter
return { -> return before calling callback `function`.
getI: function() { return _dInicio; },
getF: function() { return _dFim; },
setI: function(d) { _dInicio = d; },
setF: function(d) { _dFim = d; }
}, callback( );
^
|_ Calling callback without param `dateFilter`
看看这个代码片段
函数完成(日期过滤器){
log(dateFilter.getI());
log(dateFilter.getF());
}
(函数(回调){
var_dInicio=新日期(),
_d=新日期(),
_dFim=新日期(_d.setMonth(新日期().getMonth()-1));
回拨({
getI:function(){
返回_dInicio;
},
getF:function(){
返回_dFim;
},
setI:功能(d){
_dInicio=d;
},
setF:功能(d){
_dFim=d;
}
});
})(完成)代码>这无法工作的两个原因:
- 您正在使用逗号运算符返回
回调的结果,但done
不返回任何内容
- 在初始化
dateFilter
的IIFE期间,您试图使用dateFilter
-尚未为其分配返回值
绝对没有理由对IIFE使用回调。只要写
var dateFilter = (function() {
var _dInicio = new Date(), _d = new Date(),
_dFim = new Date(_d.setMonth(new Date().getMonth() - 1));
return {
getI: function() { return _dInicio; },
getF: function() { return _dFim; },
setI: function(d) { _dInicio = d; },
setF: function(d) { _dFim = d; }
};
}());
console.log(dateFilter.getI());
console.log(dateFilter.getF());
有两个原因无法实现这一目标:
- 您正在使用逗号运算符返回
回调的结果,但done
不返回任何内容
- 在初始化
dateFilter
的IIFE期间,您试图使用dateFilter
-尚未为其分配返回值
绝对没有理由对IIFE使用回调。只要写
var dateFilter = (function() {
var _dInicio = new Date(), _d = new Date(),
_dFim = new Date(_d.setMonth(new Date().getMonth() - 1));
return {
getI: function() { return _dInicio; },
getF: function() { return _dFim; },
setI: function(d) { _dInicio = d; },
setF: function(d) { _dFim = d; }
};
}());
console.log(dateFilter.getI());
console.log(dateFilter.getF());
你真的很接近。你对逗号运算符的直觉是正确的。我认为有一种更好的方法来连接done()
回调,这样代码更健壮,事情发生的顺序也更清晰
首先,让我们看看return
语句。所有return语句都做两件事(计算返回值,然后返回),但由于逗号的原因,这一条语句按以下顺序做三件事:
计算对象文本{getI:…}
评估callback()
,这意味着调用callback()
返回callback()
的返回值,因为逗号运算符返回它的第二个操作数
因此,请注意,callback()
实际上是在函数返回之前被调用的,因此它发生在日期过滤器有值之前。(而且,即使它确实有一个值,它也是callback()
的返回值,这是未定义的。)
我认为代码的另一个方面值得一看。回调通常采用参数。最简单的方法是:不返回值,而是将其传递给回调函数
通常,如果您传递参数而不是附带影响共享变量,那么代码更易于读取和调试
我刚刚对您的代码做了一个更改,它正在运行:
函数完成(日期过滤器){
log(dateFilter.getI());
log(dateFilter.getF());
}
(函数(回调){
var _dInicio=new Date(),_d=new Date(),
_dFim=新日期(_d.setMonth(新日期().getMonth()-1));
回拨({
getI:function(){return\u dInicio;},
getF:function(){return _dFim;},
setI:函数(d){u dInicio=d;},
setF:函数(d){u dFim=d;}
});
})(完成)代码>你真的很接近了。你对逗号运算符的直觉是正确的。我认为有一种更好的方法来连接done()
回调,这样代码更健壮,事情发生的顺序也更清晰
首先,让我们看看return
语句。所有return语句都做两件事(计算返回值,然后返回),但由于逗号的原因,这一条语句按以下顺序做三件事:
计算对象文本{getI:…}
评估callback()
,这意味着调用callback()
返回callback()
的返回值,因为逗号运算符返回它的第二个操作数
因此,请注意,callback()
实际上是在函数返回之前被调用的,因此它发生在日期过滤器有值之前。(而且,即使它确实有一个值,它也是callback()
的返回值,这是未定义的。)
我认为代码的另一个方面值得一看。回调通常采用参数。最简单的方法是:不返回值,而是将其传递给回调函数
通常,如果通过测试,代码更易于阅读和调试