这个问题在这里已有答案:
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