我正在使用一组单元格(在定性调查中),并试图编写一个名为watchSet的函数,该函数可以传递一组单元格,并向该函数监视该组单元格的任何更改(键)并运行每当该组单元中的任何一个更改时,函数都会再次传递给它。

function watchSet(set, mathFunction) {
    var setSize = set.length;
    for (var i=0; i < setSize; i++) {
        set[i].down().observe("keyup", function(){
            mathFunction
        });
    }
}


使用此功能的示例函数是qualtricsSum函数(也使用mathSum函数)

function mathSum(set, output) {
    var setTotal = 0;
    for (var j=0; j < (set.length); j++) {
        var setInputValue = parseInt(set[j].down().value, 10);
        if (isNaN(setInputValue)) { setInputValue = 0; }
        setTotal = setTotal + setInputValue;
    }
    output.down().value = setTotal;
}

function qualtricsSum(array, output) {
    watchSet(array, mathSum(array, output));
}


在watchSet函数中,我包装了通过function(){...}传递的mathFunction,并且它运行mathSum函数,但是似乎没有在键盘输入上运行它,但是如果我不使用未命名的函数将其包装,则会得到Uncaught TypeError: Cannot read property 'call' of undefined作为错误。我不确定这是否是我的问题的一部分。

当我手动运行watchSet中的for循环并将mathFunction替换为我打算运行的函数时,它实际上会运行每次我编辑单元格时提供的函数。这使我认为以某种方式调用watchSet(set,mathFunction)然后在函数定义中引用mathFunction并没有真正传递我所认为的传递。

编辑:
我意识到,一旦看到behtgod的回答,我就没有澄清这一点:
我并不总是知道mathFunction的参数是什么样的,我希望能够将带有任意数量参数的任何函数作为mathFunction传递。有时它将是具有诸如mathSum(array,output)之类的格式的函数,其他时候我希望它是mathEqual(array)或任何其他种类的东西。

最佳答案

首先,您的mathFunction是一个函数,因此您应该像

mathFunction();


二,执行以下行时

watchSet(array, mathSum(array, output));


mathSum已被调用,并且仅将结果传递给watchSet函数。

所以你应该这样使用:

function watchSet(set, mathFunction) {
    var setSize = set.length;
    for (var i=0; i < setSize; i++) {
        set[i].down().observe("keyup", function(set,output){
            mathFunction(set,output)
        });
    }
}

function mathSum(set, output) {
    ...
}


function qualtricsSum(array, output) {
    watchSet(array, mathSum);
}


因为您在回调函数中调用了mathFunction,所以mathFunction使用的参数必须是回调函数的参数

09-25 19:36