从JS中的字符串调用函数

时间:2013-01-14 15:51:01

标签: javascript function callback

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

运行此功能时,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);
        }

    }

}

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

答案 1 :(得分:0)

更改范围!我认为您无法访问window

JS Fiddle Link

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在全局范围内,并在调用此函数时准备好进行评估。