function say(str){
for(i=0;i<str.length;i++){
setTimeout(function(){
$("#text").append(str[i]);
console.log(str[i]);
},
i*200);
}
}
say("Hello World !");
似乎每个str[i]
都未定义;
如何让它有效? 我正在学习,所以如果有人解释的话会很棒。感谢。
答案 0 :(得分:3)
这是因为i
在调用您给setTimeout
的回调时具有循环结束的值。
解决方案是将其更改为
function say(str){
for(i=0;i<str.length;i++){
(function(i){
setTimeout(function(){
$("#text").append(str[i]);
},
i*200);
})(i);
}
}
这会在迭代时将i
的值保存在立即调用的内部函数中。
答案 1 :(得分:2)
我不建议使用for
循环并试图获得实际的时间排队。以setTimeout
递归调用函数对我来说更有意义,并且不会遇到关闭问题。您可以使用:
function say(str) {
(function iterator(index) {
if (index < str.length) {
$("#text").append(str.charAt(index));
console.log(str.charAt(index));
setTimeout(function () {
iterator(++index);
}, 200);
}
})(0);
}
say("Hello World !");
DEMO: http://jsfiddle.net/XnKNX/6/
.charAt()
是获取字符串字符的首选方法,因为较旧的IE不支持[]
索引。
如果你想保持for
循环(无论出于何种原因),你可以这样设置:
var say = (function () {
var generateTyper = function (s, index) {
return function () {
$("#text").append(s.charAt(index));
console.log(s.charAt(index));
};
};
return function (str) {
for (var i = 0, j = str.length; i < j; i++) {
setTimeout(generateTyper(str, i), i * 200);
}
};
})();
say("Hello World !");
答案 2 :(得分:1)