Javascript For循环不允许执行setTimeout

Javascript For循环不允许执行setTimeout,javascript,Javascript,我有一个下面的函数,它记录在给定时间传递给函数的句子中的一个字符,看看下面的函数: function print_string(param , timer) { var strt_point = 0, str_len = param.length, self = this; //typewritter(); typeit(); function typeit() { setTimeout(function(){ conso

我有一个下面的函数,它记录在给定时间传递给函数的句子中的一个字符,看看下面的函数:

function print_string(param , timer) {

  var strt_point = 0,
      str_len = param.length,
      self = this;


  //typewritter();

  typeit();

  function typeit() {

    setTimeout(function(){

      console.log(param.substring(strt_point).charAt(0)); 

      if(strt_point < str_len ) {
        strt_point++; 
        typeit()
      }
    } , timer);
  } 

}

var str = print_string("hey there , whats up , hows the weather in Manhatten" , 50);
console.log(str);
函数打印字符串(参数、计时器){
var strt_点=0,
str_len=参数长度,
self=这个;
//打字机();
键入它();
函数typeit(){
setTimeout(函数(){
console.log(参数子字符串(strt_point).charAt(0));
如果(strt_点
上面的程序员工作正常,现在如果我在上面的程序中添加一个for循环,即将setTimeout包装在for循环中

function print_string(param , timer) {

  var strt_point = 0,
      str_len = param.length,
      self = this;

  for(var i = 0 ; i < str_len ; i++) {

  //typewritter();

  typeit();

  function typeit() {

    setTimeout(function(){

      console.log(param.substring(strt_point).charAt(0)); 

      if(strt_point < str_len ) {
        strt_point++; 
        typeit()
      }
    } , timer);
  } 

}

var str = print_string("hey there , whats up , hows the weather in Manhatten" , 50);
console.log(str);
函数打印字符串(参数、计时器){
var strt_点=0,
str_len=参数长度,
self=这个;
对于(变量i=0;i
所有字符都同时打印,为什么


为什么for循环不遵守
setTimeout
间隔?有人能解释一下吗?

如果希望
timer
参数充当实际间隔,请使用以下命令:

function print_string(param, timer) {

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

    setTimeout((function(char){

      return function () {

        console.log(char);

      }

    })(param.charAt(i)), timer * i);  
  }
}

var str = print_string("hey there , whats up , hows the weather in Manhatten" , 500);
函数打印字符串(参数、计时器){
对于(变量i=0;i
这是一本书

让您感到困惑的是for循环立即发生,或者以处理器允许的速度发生。当执行
setTimeout
处理程序时,它的作用域与您可能期望的不同。该作用域不再在for循环内(因为这发生在处理器的不同刻度上)所以print变量丢失了。为了避免这个问题,我使用了所谓的闭包。我正在动态构建一个函数,打印我需要的特定变量,并将其作为参数传递给
setTimeout


阅读有关闭包的更多信息。

这两段代码的区别是:
在第一种方法中,每次触发超时功能时,您都会设置计时器。
在第二种情况下,您在每个“foreach”迭代中同时(几乎)设置了所有计时器,因此事件在同一时间触发。
你可以通过定时器+=50来阻止它。

我将尝试解释:

您正在将一个包含30个字符的字符串传递给函数
print_string
,这样for循环将迭代并调用
setTimeout
30次。50毫秒后,将调用第一个
setTimeout
回调并输出字符串的第一个字符。变量
strt_point
将递增。然后将立即调用第二次for循环迭代的第二次
setTimeout
回调,因为
strt_point
已递增,所以将打印第二个字符


问题是,对于
for
循环的所有迭代,您都有一个变量
strt\u point
,这样所有字符都会在50ms后打印出来。

我想您需要这样的东西:

var print\u string=函数(参数,间隔){
变量
i=0,
len=参数长度,
结果=document.getElementById('result'),
//为每个字符调用函数
下一步=函数(){
//获取当前角色
var char=参数charAt(i);
//你想怎么处置他们就怎么处置
result.innerHTML+=char;
//如果不是字符串的结尾
如果(++i

你在函数中有一个函数,这是不允许的,函数类型它在函数中打印\u string这不是他们所说的闭包吗?有任何文档可以证明你的说法吗?我是JS新手,所以我自己不是专家!!!这真是毫无根据@BhawinParkeria@BhawinParkeria函数内部的函数是完全允许的ed.这也有同样的效果,一次打印出所有字符:(而不是间隔打印字符!循环在一瞬间完成…创建多个函数调用,所有调用将在同一时间触发time@Tenali_raman请看修改后的答案。这里有一个小提琴的例子和一个解释。