1

我真的很好奇为什么这段代码将 defaultDate 设置为从今天起 25 年前的日期可以正常工作......

$('div.recipient_modal input[name="birth_date"]:first').datepicker({
    changeMonth: true,
    changeYear: true,
    defaultDate: get_recipient_default_birth_date(),
    yearRange: 'c-125:' + new Date().getFullYear()
});

function get_recipient_default_birth_date()
{
    var d = new Date();
    var y = d.getFullYear() - 25;
    d.setFullYear(y);
    return $.datepicker.formatDate('mm/dd/yy', d);
}

但是,当我尝试使用匿名函数而不是调用具有相同代码的命名函数,从今天开始将默认日期设置为 25 年前,如下所示......

    $('div.recipient_modal input[name="birth_date"]:first').datepicker({
    changeMonth: true,
    changeYear: true,
    defaultDate: function() {
        var d = new Date();
        var y = d.getFullYear() - 25;
        d.setFullYear(y);
        return $.datepicker.formatDate('mm/dd/yy', d);
    },
    yearRange: 'c-125:' + new Date().getFullYear(),
});

我在控制台中收到以下错误...

Uncaught TypeError: Object function () {
        var d = new Date();
        var y = d.getFullYear() - 25;
        d.setFullYear(y);
        return $.datepicker.formatDate('mm/dd/yy', d);
    } has no method 'getTime'

谁能解释这两个分配的区别以及为什么匿名函数不起作用但命名函数起作用?

谢谢你。

4

2 回答 2

4

不同之处在于,在您的第一个示例中,您实际上是在调用函数,因此datepicker获取函数返回的日期值,而不是函数本身:

get_recipient_default_birth_date()

在第二个中,您正在传递一个函数对象。该选项不支持函数。

于 2012-05-30T17:01:43.957 回答
3

您已经描述了它为什么不起作用:您将匿名函数设置为值。

不是匿名函数的返回值。

在您的第一个工作示例中,您正在调用返回默认值的函数。在您的第二个示例中,您只是定义了一个匿名函数并将其直接分配为值 - 而无需调用它。

如果您想使用这样的匿名函数,则需要实际调用它,如下所示:

defaultValue: (function() { /* stuff */; return something; })()
于 2012-05-30T17:01:41.860 回答