问题 将局部变量传递给回调函数[重复]


这个问题在这里已有答案:


1547
2017-12-16 22:42


起源



答案:


相同的变量, i  - 谁的值最终为4 - 与你在循环中创建的每个函数绑定。您可以将该函数包装在您在现场调用并传递的另一个函数中 i 作为该函数的参数:

for(var i = 0; i < sliders.size(); i++) {
 new Control.Slider(
  $(elements[i]).down('.knob'),
  $(elements[i]).down('.track'), {
   onChange: (function(inner_i) { function(value) {
    alert(elements[inner_i] + ' has been changed to ' + value);
   } })(i)
 }
}

7
2017-12-16 22:45



这给了我一个语法错误。 - JoJo
我相信这是正确的做法:onChange:function(){return function(value){alert(elements [i] + value); (element [i]) - JoJo
在看这个时,我认为作者通过省略return语句是聪明的;类似Lisp的语言默认返回最后一个表达式。不幸的是,javascript不是其中之一:( - Brian Duncan


答案:


相同的变量, i  - 谁的值最终为4 - 与你在循环中创建的每个函数绑定。您可以将该函数包装在您在现场调用并传递的另一个函数中 i 作为该函数的参数:

for(var i = 0; i < sliders.size(); i++) {
 new Control.Slider(
  $(elements[i]).down('.knob'),
  $(elements[i]).down('.track'), {
   onChange: (function(inner_i) { function(value) {
    alert(elements[inner_i] + ' has been changed to ' + value);
   } })(i)
 }
}

7
2017-12-16 22:45



这给了我一个语法错误。 - JoJo
我相信这是正确的做法:onChange:function(){return function(value){alert(elements [i] + value); (element [i]) - JoJo
在看这个时,我认为作者通过省略return语句是聪明的;类似Lisp的语言默认返回最后一个表达式。不幸的是,javascript不是其中之一:( - Brian Duncan


为每个回调创建变量的副本,您可以使用您传入值的匿名函数来执行此操作:

for(var i = 0; i < sliders.size(); i++) {

    (function(e) { // get a local copy of the current value

        new Control.Slider(
          $(elements[e]).down('.knob'),
          $(elements[e]).down('.track'), {
           onChange: function(value) {
            // ERROR: elements[e] is undefined
            alert(elements[e] + ' has been changed to ' + value);
           }
         }

     })(i); // pass in the current value
}

这样你就不会引用它了 i X次。


9
2017-12-16 22:47





以这种方式将您的函数放入闭包中:


for(var i = 0; i < sliders.size(); i++) {
 (function(q){
 new Control.Slider(
  $(elements[q]).down('.knob'),
  $(elements[q]).down('.track'), {
   onChange: function(value) {
    // ERROR: elements[q] is undefined
    alert(elements[q] + ' has been changed to ' + value);
   }
 }
 })(i)
}

0
2017-12-16 22:48