我尝试编写一个JavaScript jQuery程序,说一个数字。它代表我之前记录的一些记录。我有一个问题。当我键入数字时,它只播放最后一条记录(字符串的最后一个字符)。这是该计划:
function recognizer (num) {
var result = '#';
switch(num) {
case '0':
result += 'zero';
break;
case '1':
result += 'one';
break;
case '2':
result += 'two';
break;
case '3':
result += 'three';
break;
case '4':
result += 'four';
break;
case '5':
result += 'five';
break;
case '6':
result += 'six';
break;
case '7':
result += 'seven';
break;
case '8':
result += 'eight';
break;
case '9':
result += 'nine';
break;
}
return result;
}
$('#submit').click(function() {
var num = $('#number').val();
var delay = 1000;
for (var i = 0; i < num.length; i++) {
var indexNum = recognizer(num[i]);
setTimeout(function () {
$(indexNum).trigger('play');
}, delay);
delay += 1000;
}
});
答案 0 :(得分:2)
真正的问题是你有一个闭包,当执行该函数时,indexNum
的值已被设置为最终数字。您可以使用let
打破闭包,或使用Standard-Closure-Breaking-Pattern。
setTimeout((function (indexNum) {
return function() { $(indexNum).trigger('play'); };
})(indexNum), delay);
此外,您的recognizer
可能会被压缩。假设num
始终是一个单一的字符串,它出现的意思是给你的例子。
function recognizer(num) {
const numberWords = ['zero', 'one', 'two', ...];
return `#${numberWords[num]}`;
}
答案 1 :(得分:0)
异步功能可能会造成一些麻烦...
尝试为每个循环创建一个新的vars实例:
unsigned int
var indexNum = recognizer(num[i]);
(function (indexNum, delay) {
setTimeout(function () {
$(indexNum).trigger('play');
}, delay);
})(indexNum, delay);
&#13;