JavaScript - 在自调用函数中传递回调函数

时间:2018-02-06 17:33:06

标签: javascript closures self-invoking-function

我正在尝试在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错误,但我认为这应该有效。有人可以指出我误解了什么吗?

3 个答案:

答案 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语句。所有返回语句都执行两个事物(评估返回值,然后返回它),但由于逗号,这个按照以下顺序执行三个

  1. 评估对象文字{ getI:... }
  2. 评估callback(),即致电 callback()
  3. 返回callback()的返回值,因为逗号运算符返回它的第二个操作数。
  4. 因此,请注意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的参数。)

    我希望能为你澄清一些事情。干杯!