0

我有一个基本的小部件,我可以将函数调用推送到(几乎像谷歌分析,ga.js)

这是小部件代码:

var widget = function () {

    function _private_setName(a, callback) {
        console.log(a[0]);

        callback(a[0]);
    }

    return{
       setName:_private_setName
    };  
}();

if (window._test) {
    for (var i = 0; i < _test.length; i++) {
        var method = _test[i].shift();
        try {
            widget[method].apply(widget, _test);
        }
        catch(err) { }
    }
}

window._test = {
    push: function() {
        try {
            var args = Array.prototype.slice.call(arguments, 0);
            var method = args[0].shift();
            widget[method].apply(widget, args);
        }
        catch(err) { }  
    }
};

所以我目前能做的是:

var _test = _test || [];
_test.push(['setName', 'Todd']);

但是我希望能够从函数 setName 中获取回调。

我试过了:

_test.push('setName', 'Todd', function(num) {
    console.log("callback called! " + num);
});

但我无法让它工作,有什么想法可以实现吗?

4

2 回答 2

2

你应该改变

var method = args[0].shift();

var method = args.shift();

之后将调用回调。这是一个带有工作版本的 jsfiddle http://jsfiddle.net/krasimir/pLuad/1/

于 2013-08-20T11:57:08.160 回答
0

这是一些非常笨拙的代码,您可以在那里实现您想要做的事情。回调的一个常见做法是在将回调传递给的函数中使用 arguments[arguments.length -1],因此它始终是“最后一个”参数将用作回调函数。然后你说

if(typeof arguments[arguments.length - 1] === 'function'){
    arguments[arguments.length - 1](dataToPassToCallback);
}

在您的情况下,您似乎添加了许多不必要的抽象并使这比需要的要困难得多。例如,您正在声明一个“小部件”对象/类,然后将其自身的静态实例分配给它(小部件 [fnName] = widget.apply()) - 所以现在当您声明更多小部件时,它们都是包含对其他小部件方法的引用。

我想你真正想要的是让 Widget 类成为它自己的东西,并且有一个 WidgetManager 类或一个 Widgets 类,然后它们会做与你的 _test 数组正在做的事情类似的事情。

于 2013-08-20T12:04:10.063 回答