Javascript setTimeout变量超出范围 //随机字符串 var strings=[“这怎么可能?”,“你听说过吗?”; var WriteLine=函数 { var end=s.length,sc=s.split(“”); 对于(counter=0;counter

Javascript setTimeout变量超出范围 //随机字符串 var strings=[“这怎么可能?”,“你听说过吗?”; var WriteLine=函数 { var end=s.length,sc=s.split(“”); 对于(counter=0;counter,javascript,html,Javascript,Html,问题的答案是使用闭包,您必须“保存”上下文。 您使用的setTimeout在一段时间后执行函数,而for循环的速度(比方说)超过20毫秒,因此当setTimeout执行函数时,您的函数计数器已经是s.length了,这就是为什么您的计数器没有定义 <script language="javascript"> // random strings var strings = ["How is it even possible?", "Have you ever hea

问题的答案是使用闭包,您必须“保存”上下文。 您使用的setTimeout在一段时间后执行函数,而for循环的速度(比方说)超过20毫秒,因此当setTimeout执行函数时,您的函数计数器已经是s.length了,这就是为什么您的计数器没有定义

  <script language="javascript">
    // random strings
    var strings = ["How is it even possible?", "Have you ever heard about this?"];
    var WriteLine = function(s)
    {
      var end=s.length, sc=s.split("");
      for(counter = 0;counter<end;counter++)
      {
        setTimeout(function(){document.write(sc[counter]);},20);
        //                                   ^^^^^^^^^^^
      }
    }
    strings.forEach(WriteLine);
  </script>
//随机字符串
var strings=[“这怎么可能?”,“你听说过吗?”;
var WriteLine=函数
{
var end=s.长度,
sc=s.分割(“”);

对于(计数器=0;计数器不超出范围,当超时发生时它有错误的值。而且,不,这与<代码> < <代码> >有关。在处理SETTIMEOUT时要考虑的另一件事是<代码> SETTIMEOUT在全局范围< /代码>中执行,因此它将为全局变量提供优先权。谢谢您的帮助!)
// random strings
var strings = ["How is it even possible?", "Have you ever heard about this?"];
var WriteLine = function(s)
{
  var end=s.length, 
      sc=s.split("");
  for(counter = 0;counter<end;counter++)
  {
    setTimeout((function(c){
      document.write(sc[c]);
    })(counter),20);
    //                                   
  }
}
strings.forEach(WriteLine);