多次调用另一个javascript函数中的javascript函数

calling a javascript function in another javascript function several times

本文关键字:javascript 函数 另一个 调用      更新时间:2023-09-26

我有一个javascript函数,它运行良好:

function playMp3(str) {
  ...
}

另一个脚本:

function playMp3wholepage() {
  var dgs=new Array();
  dgs[0] = "/abc.mp3";
  dgs[1] = "/dac.mp3";
  dgs[2] = "/hf.mp3";
  ....
  dgs[28] = "/er23.mp3";
  dgs[29] = "/read/34_15.mp3";
  for (i=0;i<=29;i++){
    ses = dgs[i]
    setTimeout("playMp3(ses);", 2000)
  }
}

我想按照第二个剧本中给出的顺序播放所有的声音。但我无法运行第二个脚本,它只是播放最后一个声音(dgs[29]),而不是全部。

感谢

当执行setTimeout回调时,sec已经是dgs[29],您需要创建另一个函数范围来提供值。

for (var i=0; i<=dgs.length; i++){
   (function (i) {
       setTimeout(function() {
           playMp3(dgs[i]);
       }, 2000 * i);
   }(i));
}

这是关于闭包的内容。你可以在这里了解更多。

function playMp3wholepage() {
   var dgs=new Array();
   dgs[0] = "/abc.mp3";
   dgs[1] = "/dac.mp3";
   dgs[2] = "/hf.mp3";
   for (i=0;i<dgs.length;i++){
       ses = dgs[i];
       (function(mp3) {
           setTimeout(function() {
               playMp3(mp3);
           }, 2000);
       })(ses);
   }
}

我猜发生的事情是循环完成得太快了,以至于对playMp3的所有调用基本上都是同时调用的。然而,对setTimeout的最后一次调用会设置播放的最后一个声音,这就是为什么它是你听到的全部。

此外,使用长度或数组,并使代码灵活:

for(var i=0; i<dgs.length; i++) {      
}