我有一个字符串数组,我希望用作回调函数,但下面的代码不起作用。
运行此功能时,TypeError: fn is not a function
仅包含callback_array
时,我收到错误update_front_page_images
。
callback_array
目前只包含1个元素(update_front_page_images
),这是我希望运行的函数的名称。
有人可以让我知道我做错了吗?
function run_reset_callbacks(callback_array){
for(var key in callback_array){
try {
fn = window[callback_array[key]];
fn();
}
catch(err) {
console.log('Function \''+callback_array[key]+'\' does not exist. '+err);
}
}
}
答案 0 :(得分:1)
如果要使用此模型,请确保以一种可以将其称为窗口[]的方式定义函数。您需要将函数定义为窗口对象上的变量。标准函数定义将失败。
//Works
window.hello = function () {
alert("hello");
};
//Works
test = function () {
alert("test");
};
//Fails
function fail() {
alert("fail")
};
如果您使用此方法,这应该可以解决问题,但我建议您遵循Matt Ball的建议。
答案 1 :(得分:0)
更改范围!我认为您无法访问window
:
var outputDiv = document.getElementById('output');
// Wrong
var cbArray = ['update_front_page_images', 'dummyFunction']; // Array created from PHP
function update_front_page_images() {
outputDiv.innerHTML = outputDiv.innerHTML+ '<br/>' + 'Called me? I am "update_front_page_images" !!';
}
function dummyFunction() {
outputDiv.innerHTML = outputDiv.innerHTML+ '<br/>' + 'Called me? I am "" !!';
}
// -- Wrong
// Right
var cbArray = {
'update_front_page_images': function() {
outputDiv.innerHTML = outputDiv.innerHTML+ '<br/>' + 'Called me? I am "update_front_page_images" !!';
},
'dummyFunction': function() {
outputDiv.innerHTML = outputDiv.innerHTML+ '<br/>' + 'Called me? I am "dummyFunction" !!';
}
}
// -- Right
// your Code
function run_reset_callbacks(callback_array){
for(var key in callback_array){
try {
fn = window[callback_array[key]]; // Wrong
fn = callback_array[key]; // Right
fn();
}
catch(err) {
outputDiv.innerHTML = 'Function \''+callback_array[key]+'\' does not exist. '+err;
}
}
}
run_reset_callbacks(cbArray);
答案 2 :(得分:-1)
应使用索引循环枚举数组:
for (var i = 0; i < callback_array.length; i++) { ... }
如果callback_array
确实是文字对象,那么上面的方法很好,但在评估属性之前检查hasOwnProperty
会更安全。
if(callback_array.hasOwnProperty(key)) { ... } // use it
否则,请确保update_front_page_images
在全局范围内,并在调用此函数时准备好进行评估。