将作为参数传递的函数与数字相关联

时间:2017-06-13 07:45:58

标签: javascript function onchange

我试图在Javascript中使用以下代码。我希望迭代地将函数 rulefunc()多次传递到 onChange()函数中。我希望能够在调用函数时从函数内部访问 i 。我怎么能这样做?

var gui = new DAT.GUI();

for   for (var i=0; i<5; i++) {

  // want to associate ruleFunc with i
  gui.add(lsys, 'grammarString').onChange(ruleFunc);

}

function ruleFunc(newVal) {
  ...
  // access i here
}

2 个答案:

答案 0 :(得分:1)

在活动方面:

这里因为循环是同步的,所以使用IIFE以便传递i的正确值 IIFE和onchange事件产生一个闭包,使得i的正确值被传递 在论点

在活动回调方

使用Closure,以便返回的函数可以访问参数的值

var gui = new DAT.GUI();

for (var i=0; i<5; i++) {
     // want to associate ruleFunc with i
    (function(a){ //making an IIFE to make sure right value of i is passed to the function
        f1.add(lsys, 'grammarString').onChange(ruleFunc(a));
    })(i);
}

function ruleFunc(newVal) {
    return function(){ 
        //making a closure which will have access to the argument passed to the outer function
        console.log(newVal); 
    }

}

答案 1 :(得分:0)

您可以编写一个返回类似

的函数的函数
function ruleFunc(i) {

  return function(newVal){
     // ... here use your newVal and i
  }

}

并使用

f1.add(lsys, 'grammarString').onChange(ruleFunc(i));

您调用从外部范围获取i的函数,然后返回的函数获取&#39; onChange&#39;的newVal。事件。请注意,我正在调用函数ruleFunc并传递参数i。在功能内部,您现在可以使用i变量和newVal

它的工作原理示例。在这里,我使用approprite i值向数组添加函数。之后,当我执行每个函数时,它正确地知道创建它时使用了什么i。它被称为closure

&#13;
&#13;
var functions = [];

function ruleFunc(newVal) {
  return function (){
    console.log(newVal);
  };
}

for(var i = 0; i < 5; i++) {
  functions.push(ruleFunc(i));
}

for(var i = 0; i < functions.length; i++) {
  functions[i]();
}
&#13;
&#13;
&#13;