0

我有一个字符串数组,希望用作回调,但下面的代码不起作用。

运行该函数时,TypeError: fn is not a functioncallback_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);
        }

    }

}
4

3 回答 3

1

如果您想使用此模型,请确保您以一种可以将它们称为 window[] 的方式定义您的函数。您需要将函数定义为窗口对象上的变量。标准函数定义将失败。

http://jsfiddle.net/HpXYM/2/

//Works
window.hello = function () {
  alert("hello");
};

//Works    
test = function () {
  alert("test");
};

//Fails
function fail() {
  alert("fail")
};

如果您采用这种方法,这应该可以解决问题,但我建议您遵循 Matt Ball 的建议。

于 2013-01-14T15:57:59.730 回答
0

改变你的范围!我认为您无法访问window

JS小提琴链接

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);
于 2013-01-14T16:26:23.620 回答
-1

应使用索引循环枚举数组:

for (var i = 0; i < callback_array.length; i++) { ...  }

如果callback_array真的是一个文字对象,上面的方法很好,但hasOwnProperty在评估属性之前检查会更安全。

if(callback_array.hasOwnProperty(key)) { ... } // use it

否则,请确保它update_front_page_images在全局范围内并准备好在调用此函数时进行评估。

于 2013-01-14T15:54:58.560 回答