2013-04-30 44 views
0

我:获取无限调用堆栈与此javascript

var c = { 
    typeStart: function(msg, loc) { 
     loc.append("<p>"); 
     this.typeLetter(msg, loc, 0); 
    }, 

    typeLetter: function(msg, loc, pos) { 
     loc.append(msg.charAt(pos)); 
     pos = pos + 1; 
     if (pos == msg.length) { this.typeEnd(loc); } 
     setTimeout(this.typeLetter(msg, loc, pos), 100); 
    }, 

    typeEnd: function(loc) { 
     loc.append("</p>"); 
    } 
} 

c.typeStart("hello", $("#somediv")); 

出于某种原因,而我显然失去了一些东西,typeLetter被称为无限。我假设它与JavaScript的异步性有关。

回答

4

这是你的问题:

typeLetter: function(msg, loc, pos) { 
    loc.append(msg.charAt(pos)); 
    pos = pos + 1; 
    if (pos == msg.length) { this.typeEnd(loc); } 
    setTimeout(this.typeLetter(msg, loc, pos), 100); 
},    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

该函数将被调用和结果将被传递到setTimeout。你需要把它包装在一个匿名函数中:

setTimeout(function() { 
    this.typeLetter(msg, loc, pos); 
}, 100); 
+0

啊,是的,这是有道理的。我会尽我所能接受。 – n0pe 2013-04-30 00:32:26