我正在使用一组单元格(在定性调查中),并试图编写一个名为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使用的参数必须是回调函数的参数