我正在尝试动态调用对象内部的函数。找到了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 || []);
}
}
};
答案 0 :(得分:3)
在这里使用apply
会有(至少)两个问题。
这是一个函数对象的方法,你似乎是在字符串上调用它
它总是以数组作为第二个参数 - 传入一个字符串或一个空数组。
尝试这样称呼:
Test[do.action].apply(this, do.id ? [do.id] : []);
使用Test[do.action]
将访问实际的函数,而不是字符串“showSomething”或“showOther”,do.id ? [do.id] : []
将始终返回一个数组。
答案 1 :(得分:2)
问题是do.action
是一个字符串,而不是一个函数。您可以通过以下两种方式之一更改代码。
不是在函数库中存储函数的名称,而是实际存储函数:
queue : [ { action: this.showSomething ...
您可能需要确保先定义它或类似的东西。
将字符串解析回实际属性:
this[do.action].apply(...)