【问题标题】:How do I add a parameter in a callback function using prototype.js?如何使用prototype.js 在回调函数中添加参数?
【发布时间】:2010-11-01 02:58:38
【问题描述】:

使用prototype.js,我创建了一个自定义对象,它将作为构造函数的参数:

var options = Object.extend({month: date[0],
                             year: date[1],
                             day: date[2],
                             oncalchange: update});
// update is defined like that :
var update = function(d){
    // bla bla
}

// Calling my class
var myObject = new myClass (options);

在 oncalchange 选项上,我有一个名为“update”的回调函数,它接受 myClass 中的一个参数。

现在,我想向“更新”函数传递一个额外的参数,但不是直接在类中。

我想做这样的事情:

// element is the parameter I want to add
var update = function(d, element){
    alert(element);
}

显然它不起作用,我怎么能做类似的事情?

【问题讨论】:

    标签: javascript oop prototypejs


    【解决方案1】:

    在prototype中,可以使用bind函数(属于所有函数)来预填值,分配上下文。如果不需要使用 context 参数,可以使用 curry 函数来代替

    例如:

    var options = Object.extend({month: date[0],
                                     year: date[1],
                                     day: date[2],
                                 oncalchange: update.bind(this,arg1, arg2)});
    

    var options = Object.extend({month: date[0],
                                     year: date[1],
                                     day: date[2],
                                 oncalchange: update.curry(arg1,arg2)});
    

    有关绑定的更多信息,请参阅http://www.prototypejs.org/api/function/bind,以及 http://www.prototypejs.org/api/function/curry 获取有关咖喱的信息

    编辑

    将更新函数更改为:

    var update = function(element,d){
        alert(element);
    }
    

    然后如上所述使用 curry 或 bind 预定义元素。

    我假设回调需要一个带有一个参数的函数,并且您希望它花费一秒钟,您可以在设置回调时定义。在这种情况下,参数的顺序非常重要。 curry 和 bind 可用于从一开始就预加载参数,因此,您要预加载的参数应在任何其他参数之前定义。希望这样可以解决问题。

    【讨论】:

    • 是的,我尝试了绑定功能。但是我使用绑定或咖喱得到了一个“未定义”的变量。 update.bind(this, 'ok') ... update.curry('ok'); ... var update = function(d, el){ console.log(el); // el 未定义 }
    • 在您的示例中,您只向函数传递了一个值。从一开始就咖喱和绑定预加载...我会编辑
    • 谢谢,但即使我更改顺序,“元素”也会变成“d”并且“d”未定义。
    • 我的错,我在错误的函数上应用了咖喱。咖喱效果很好,谢谢。
    【解决方案2】:

    我不太确定你想要完成什么,但是像这样吗?

    var options = Object.extend({month: date[0],
                                     year: date[1],
                                     day: date[2],
                                 oncalchange: function(d){ return update(d, 'somethingelse');}
                                 });
    

    【讨论】:

    • "element" 未使用此定义。实际上我实例化了一个日历,oncalchange 是一个事件函数(Prototype.emptyFunction),当我更改日历中的值时调用。
    猜你喜欢
    • 2013-12-18
    • 2015-08-27
    • 2017-05-21
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多