当前位置:  开发笔记 > 编程语言 > 正文

简单的JavaScript String.replace.call导致"InternalError:太多的递归"

如何解决《简单的JavaScriptString.replace.call导致"InternalError:太多的递归"》经验,为你挑选了1个好方法。

给出以下JavaScript"类"定义:

var Quota = function(totalMinutes){
    this.totalMinutes = parseInt(totalMinutes || 0, 10);
};

Quota.prototype.valueOf = function(){
    return this.totalMinutes;
};

Quota.prototype.toString = function(format){
    format = format || "hh:mm";

    return format.replace.call(this, /hh?|mm?/g, function(match){
        switch (match) {
            case "hh":
                return this.totalMinutes * 60;
            case "mm":
                return this.totalMinutes;
        }
    });
};

你能否详细解释下面为什么打电话给toString()......

var q1 = new Quota(60);
console.log( q1.toString() );

...导致出现以下错误:

InternalError:过多的递归{message ="过多的递归",更多...}

我在Firebug控制台中运行代码(Firefox 3.5.7 + Firebug 1.5).理想情况下,我想知道递归回调的位置toString()以及关于如何通过call或执行替换功能的建议apply



1> Kobi..:
return format.replace.call(this, /hh?|mm?/g, function(match)

format.replace试图调用this.toString,以无限递归结束.根据要求,这是一个证据:http://jsbin.com/eweli/:

var Quota = function(totalMinutes){
    this.totalMinutes = parseInt(totalMinutes || 0, 10);
};

Quota.prototype.toString = function(format){
    alert ("Quota.prototype.toString is called");
};

var q1 = new Quota(60);
var a = "string".replace.call(q1,'hello','world');

试试这个:

return format.replace(/hh?|mm?/g, function(match)

编辑

抛开问题,我发现允许函数访问当前配额的最好方法是在它的闭包之外创建一个变量:

Quota.prototype.toString = function(format){
    format = format || "hh:mm";
    var quota = this;
    return format.replace(/hh|mm/g, function(match){
        switch (match) {
            case "hh":
                return quota.totalMinutes / 60;
            case "mm":
                return quota.totalMinutes;
        }
        return match;
    });
};

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有