Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-在自调用函数中传递回调函数_Javascript_Closures_Self Invoking Function - Fatal编程技术网

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(),

我试图在JavaScript中的
自调用函数
中传递
回调
函数,但在执行
完成
函数时,我得到了“未定义”的结果

我读了下面的代码:

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()
    的返回值,这是未定义的。)

    我认为代码的另一个方面值得一看。回调通常采用参数。最简单的方法是:不返回值,而是将其传递给回调函数

    通常,如果通过测试,代码更易于阅读和调试