文字对象功能范围,如何传递功能和功能上下文到第3个

时间:2014-03-11 07:42:48

标签: javascript

我有这个回调'机器': 它被设计为对象文字。

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'再次变为null值....

我想为所调用的函数提供一个干净的解决方案。 我不想在这些中编写更多代码。 var F1 = function(loop_back){... bla bla; loop_back(); } 如您所见,我只将loop_back参数作为参数编写,我用它来进行回调。

我认为我的案例是特别的,与范围和范围相关的问题有所不同。 object literal。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您将步进放在错误的位置,如果您在环回电话后调用,则永远不会到达。

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);