【发布时间】:2023-04-07 20:49:01
【问题描述】:
背景(您可能想跳过此内容)
我正在开发一个网络应用程序,它可以在播放声音的同时为英语音素的发音设置动画。它基于Interactive Sagittal Section by Daniel Currie Hall,第一次尝试可以找到here。
对于下一个版本,我希望每个音素都有自己的动画时间,这些时间定义在一个数组中,而数组又包含在一个对象变量中。
为了这篇文章的简单起见,我将时间数组变量从对象移到了函数中。
问题
我设置了一个 for 循环,我认为它会引用索引 i 和数组 t 来设置每个 setTimeout 的毫秒数。
function animateSam() {
var t = [0, 1000, 2000, 3000, 4000];
var key = "key_0";
for (var i = 0; i < t.length; i++) {
setTimeout(function() {
console.log(i);
key = "key_" + i.toString();
console.log(key);
//do stuff here
}, t[i]);
}
}
animateSam()
但是,似乎毫秒是由函数到达堆栈顶部时碰巧设置的。
问题:是否有可靠的方法来设置数组中的毫秒数?
【问题讨论】:
-
使用
let代替var,或者更好的是,使用数组方法代替for循环。 -
您是否尝试将
i移动到for loop body内的另一个变量中,或者更像是将毫秒数复制到另一个变量中?喜欢var x = t[i] -
除了
let而不是var,为什么不用i * 1000代替数组的方式呢?硬编码什么是简单的数学似乎违反直觉.. -
@ivan, baao:这只是一个例子——音素没有间隔一秒的时间,他真正的用例不是那个数组。
-
@Dominic Tobias 我分配了“var key;”在 for 循环之外,但忘记将其复制到我的简化示例中。感谢您的提醒,我已经修改了问题。
标签: javascript arrays for-loop settimeout