使用此javascript获取无限调用堆栈

时间:2013-04-30 00:26:24

标签: javascript asynchronous infinite-loop

我有:

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的异步性有关。

1 个答案:

答案 0 :(得分: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);