文字对象函数作用域,如何传递函数&第三种情况

Literal object function scope, how to pass function & context to a 3rd

本文关键字:情况 三种 传递函数 函数 对象 作用域 文字      更新时间:2023-09-26

我有这个回调'machine':它被设计为对象字面值。

APC.UTIL.Callback = {
    nn: 0,
    step: 0,
    Myargs: null,
    that: null,
    internal: function () {
        var the_f = that.Myargs[that.step];
        if (that.step < that.nn) the_f(that.internal);
        else {
            the_f();
            that.Myargs = null;
        }
        that.step++;
    },
    loop: function () {
        this.Myargs = arguments;
        this.nn = this.Myargs.length - 1, this.step = 0;
        that = this;
        this.internal();
    },
}

我这样使用它:

 var F1 = function (loop_back) { ... bla bla ; loop_back(); }
 var F2 = function (loop_back) { ... bla bla ; loop_back(); }
 var F3 = function (loop_back) { ... bla bla ; loop_back(); }
 var F4 = function (loop_back) { ... bla bla ; loop_back(); }
 // -------------------------------------------------------
 APC.UTIL.Callback.loop(F1,F2,F3,F4);

回调第一次调用自己,内部的。然后F1接收到稍后使用它的函数,并再次调用'internal', F2等....(F1 F2 F3存储在Myargs数组中)

已知的问题…缺少那个或这个(范围)。在第二次调用' that'再次变为空值....

我想要一个干净的解决方案的函数调用。我不想写更多的代码在这些。var F1 = function (loop_back){…咩咩;loop_back ();}正如你所看到的,我只写了loop_back参数作为形参,然后用它来进行回调。

我认为我的情况是特殊的,不同于与范围相关的问题;对象字面量。

任何帮助都会很感激。

您将步进放置在错误的位置,如果在环回调用之后调用它将永远无法到达。

var example = {
    nn: 0,
    step: 0,
    Myargs: null,
    that: null,
    internal: function () {
        var the_f = that.Myargs[that.step];
        if (that.step < that.nn) {
            that.step++;
            the_f(that.internal);
        } else {
            // ...this method expects a function as a parameter.
            the_f(function(){});
            that.Myargs = null;
        }
        // will never be reached
        // that.step++;
    },
    loop: function () {
        this.Myargs = arguments;
        this.nn = this.Myargs.length - 1, this.step = 0;
        that = this;
        this.internal();
    },
}
var F1 = function (loop_back) { console.log("F1"); loop_back(); }
var F2 = function (loop_back) { console.log("F2"); loop_back(); }
var F3 = function (loop_back) { console.log("F3"); loop_back(); }
var F4 = function (loop_back) { console.log("F4"); loop_back(); }
example.loop(F1, F2, F3, F4);