Javascript OOP - 返回函数内的函数

时间:2015-07-17 22:52:00

标签: javascript oop

尝试创建仅在同一行内调用其他函数时才调用的函数调用。

var processTrack = new function() {
    this.current = 1;
    this.max = 5800;
    this.min = 0;
    this.done = function(started, processing, cur, len) {
        cur = cur || 0;
        len = len || 1;
        var res = 0;
        if (started && !processing)
            res = ((this.current - 1 - this.min) / (this.max - this.min)).toFixed(2);
        else if (!started && processing)
            res = (this.done(true, false) + (this.step() * this.cur / this.len)).toFixed(2);
        else if (!started && !processing)
            res = ((++this.current - 1 - this.min) / (this.max - this.min)).toFixed(2);

        this.percentage = function() {
            return res * 100 + "%";
        };
        return res;
    };
    this.step = function() {
        return 1 / (this.max - this.min);
    };
}

我最理想的是致电processTrack.done(args).percentage()以获取我从.done(args)收到的数据中的百分比,但每当我尝试致电(例如)processTrack.done(true, false).percentage()时,它都会给我一个错误话说:

TypeError: processTrack.done(...).percentage is not a function

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您需要在this功能结束时返回res而不是this.done。通过返回this,您将返回this.done函数,该函数中包含percentage函数。

以下代码运行时没有错误:

var processTrack = new function() {
    this.current = 1;
    this.max = 5800;
    this.min = 0;
    this.done = function(started, processing, cur, len) {
        cur = cur || 0;
        len = len || 1;
        var res = 0;
        if (started && !processing)
            res = ((this.current - 1 - this.min) / (this.max - this.min)).toFixed(2);
        else if (!started && processing)
            res = (this.done(true, false) + (this.step() * this.cur / this.len)).toFixed(2);
        else if (!started && !processing)
            res = ((++this.current - 1 - this.min) / (this.max - this.min)).toFixed(2);

        this.percentage = function() {
            return res * 100 + "%";
        };
        return this;
    };
    this.step = function() {
        return 1 / (this.max - this.min);
    };
}

processTrack.done(true, false).percentage();

答案 1 :(得分:1)

以完成方法返回此内容。因为它返回的res不是一个对象