这是我的函数,当调用相关节点变为红色然后什么也不做。
这是javascript:
function blink (node, flickers)
{
originalColour = node.style.color;
for (i = 1; i <= (flickers*2); i++)
{
setTimeout (function () {ChangeColor (node, (((i%2) == 0) ? (originalColour) : ('red')))}, (i*200));
}
}
function ChangeColor (node, color)
{
node.style.color = color;
}
答案 0 :(得分:3)
i
被调用时, i
在匿名函数被称为“i
”时为“setTimeout
。
您需要创建一个闭包并将当前值i
传递给它。
function ChangeColorLater(i) {
return function () {
ChangeColor (node, (((i%2) == 0) ? (originalColour) : ('red')))
}
}
setTimeout (ChangeColourLater(i), (i*200));
答案 1 :(得分:1)
问题在于每次超时执行时,i等于闪烁* 2.
使用闭包,您可以在设置超时时捕获i的值,并将其传递给ChangeColor函数。在执行回调时,index(下面)将等于设置超时时的i值。
你想要的是:
function blink (node, flickers) {
var originalColour = node.style.color;
for (var i = 1; i <= (flickers*2); i++) {
setTimeout (function (index) { // current value for i in loop becomes var index
return function() {
ChangeColor(node, (index % 2 == 0) ? originalColour : 'red');
}
}(i), i*200)
}
}
function ChangeColor (node, color) {
node.style.color = color;
}
答案 2 :(得分:0)
更容易阅读。 http://jsfiddle.net/wUkfe/22/
function blink(node, flickers){
var color = node.style.color;
(function blinker(){
node.style.color = (flickers % 2) ? "red" : color;
if (flickers--){
setTimeout(blinker, 1000);
}
})();
}