我正在尝试在JavaScript callback
内传递self-invoking function
函数,但我得到了“未定义”#39;执行done
函数时。
我阅读this answer来编写以下代码:
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);
也许我使用comma operator错误,但我认为这应该有效。有人可以指出我误解了什么吗?
答案 0 :(得分:3)
您在done
之后调用return
函数,而且,您没有通过参数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`
function done(dateFilter) {
console.log(dateFilter.getI());
console.log(dateFilter.getF());
}
(function(callback) {
var _dInicio = new Date(),
_d = new Date(),
_dFim = new Date(_d.setMonth(new Date().getMonth() - 1));
callback({
getI: function() {
return _dInicio;
},
getF: function() {
return _dFim;
},
setI: function(d) {
_dInicio = d;
},
setF: function(d) {
_dFim = d;
}
});
})(done);

请参阅?现在正在印刷价值。
答案 1 :(得分:2)
这不起作用的两个原因:
callback
的结果,但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());
答案 2 :(得分:1)
你真的关闭。你对逗号运算符的预感是正确的。而且我认为有更好的方法来连接你的done()
回调,这样代码就会更健壮,事情发生的顺序会更清晰。
首先,让我们看一下return
语句。所有返回语句都执行两个事物(评估返回值,然后返回它),但由于逗号,这个按照以下顺序执行三个:
{ getI:... }
callback()
,即致电 callback()
callback()
的返回值,因为逗号运算符返回它的第二个操作数。因此,请注意callback()
实际上会在函数返回之前调用,因此在 dateFilter
之前发生值。 (而且,即使确实有值,它也会是callback()
的返回值,这是未定义的。)
我认为您的代码的另一个方面我觉得值得一看。回调通常采用参数。想到它的最简单方法是:不将返回值,而是将其传递给回调。
通常,如果传递参数而不是副作用共享变量,代码更容易阅读和调试。
我刚刚对您的代码进行了一次更改,并且它正在运行:
function done(dateFilter) {
console.log(dateFilter.getI());
console.log(dateFilter.getF());
}
(function(callback) {
var _dInicio = new Date(), _d = new Date(),
_dFim = new Date(_d.setMonth(new Date().getMonth() - 1));
callback({
getI: function() { return _dInicio; },
getF: function() { return _dFim; },
setI: function(d) { _dInicio = d; },
setF: function(d) { _dFim = d; }
});
})(done);

那么,我做了什么?
dateFilter
值副作用,而是直接将其传递给callback
。这意味着:return
语句中没有逗号运算符,也不需要对dateFilter
全局值产生副作用。 (dateFilter
现在是done
isantead的参数。)
我希望能为你澄清一些事情。干杯!