我试图在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
}
答案 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。
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;