动态函数调用(apply)

时间:2009-12-10 23:18:01

标签: javascript

我正在尝试动态调用对象内部的函数。找到了apply函数但没有完全理解它。点击下面的代码,触发Test.checkQueue()它应该依次调用showSomething“方法”。感谢。

var Test = {    
    , queue : [{action:'showSomething', id:'1234'},{action:'showOther', id:'456'}]
    , showSomething: function(what) {
        alert(what);    
    }
    , checkQueue : function() {
        console.log('checkQueue');
        console.log(this.queue);
        if (this.queue.length) {
            var do = this.queue.shift();
            console.log(do);
            // action.action(action.id);
            do.action.apply(this, do.id || []);
        }
    }

};

2 个答案:

答案 0 :(得分:3)

在这里使用apply会有(至少)两个问题。

  1. 这是一个函数对象的方法,你似乎是在字符串上调用它

  2. 它总是以数组作为第二个参数 - 传入一个字符串或一个空数组。

  3. 尝试这样称呼:

    Test[do.action].apply(this, do.id ? [do.id] : []);
    

    使用Test[do.action]将访问实际的函数,而不是字符串“showSomething”或“showOther”,do.id ? [do.id] : []将始终返回一个数组。

答案 1 :(得分:2)

问题是do.action是一个字符串,而不是一个函数。您可以通过以下两种方式之一更改代码。

  1. 不是在函数库中存储函数的名称,而是实际存储函数:

    queue : [ { action: this.showSomething ...
    

    您可能需要确保先定义它或类似的东西。

  2. 将字符串解析回实际属性:

    this[do.action].apply(...)