如何存储包含参数的JS函数引用

时间:2015-03-19 16:09:43

标签: javascript jquery html

This Stack post显示了如何将参数作为.on()绑定过程的一部分传递给JavaScript函数引用。我想将参数与数组内的引用存储在对象中。


我在文件顶部定义了一些函数:

function func1() {
     $('.result p').text('func1 success');
}
function func2() {
     $('.result p').text('func2 success');
}
function func3(someNum) {
     $('.result p').text('func3 success, someNum is ' + someNum);
}

我后来在同一个文件中有一个对象:

objects[0] = {
    name : "Object 1",
    funcs : [
        func1,
        func2,
        func3// This is where I want to pass an arg, someNum
        ]
};

当某个事件发生时,我会动态创建3个按钮,每个按钮从对象的数组中绑定到这3个函数中的一个:

// append a button for each func
funcs.forEach(function(thisFunc) {
    $('.buttons').append('<button id="' +
        thisFunc.name + '">Run ' +
        thisFunc.name + '</button>');
    // bind that button to that func
    $('#' + thisFunc.name).click(thisFunc);
});

这一切都适用于func1func2,但我找不到任何关于如何将此场景中的参数传递给像func3这样的函数的文档。理想情况下,我想将它存储在数组中,如下所示:

funcs : [
    func1,
    func2,
    func3(5)
    ]

但是它会调用该函数(您可以将(5)添加到下面粘贴的Fiddle中以查看其中的操作)。我希望绑定到func3函数,并传递参数someNum = 5,但只调用函数onclick

演示:

这个Fiddle是一个有效的演示,没有将参数传递给func3,这是我不知道该怎么做的部分。

此外,如果我的问题在于我的绑定方式,动态创建按钮或存储对函数的引用,请告诉我。我没有与这个代码结构结合,这只是构建它的方式。

3 个答案:

答案 0 :(得分:4)

使用Function.prototype.bind方法创建新函数:

funcs : [
    func1,
    func2,
    func3.bind(null, 5)
]

bind将使用将在其中传递的参数创建一个新函数。

另一种方法是创建一个匿名函数,检查John Bledsoe的答案。

答案 1 :(得分:4)

我认为这应该有效:

objects[0] = {
    name : "Object 1",
    funcs : [
        func1,
        func2,
        function() { return func3(5); }
        ]
};

答案 2 :(得分:-1)

绑定到按钮时,您也可以同时使用apply和call

func.call(null, 5); '5 is just an example, give whatever param you want

func.apply(null, [5]);

通过'绑定'我的意思是onclick =“func [3] .call(...)”in html或$(someobject).click(function(){func [3] .call(...)} )。

尤其是我的好朋友Lye Fish http://jsfiddle.net/d96ev3c8/8/的小提琴,他将会争论更多。