2010-12-13 5 views
0

, пожалуйста, помогите У меня есть простой пример здесь JavaScript функция обратного вызова

<script type="text/javascript" language="javascript"> 
    function test(callback1) { 
     callback1(); 
    } 
    var f1 = function() { 
     alert(1); 
    } 
</script> 

В настоящее время параметр функции тестирования является функцией, когда кнопка а нажата, функция тестирования будет называться, а затем тест будет вызывать f1. Все в порядке со мной.

Тем не менее, мне нужно небольшое изменение: параметр тестовой функции будет строкой, я имею в виду, что это должно быть имя функции, test ('f1') вместо test (f1). Возможно ли это? Как это реализовать?

Благодаря

+0

Возможный дубликат [имя функции JavaScript как строка ...] (http://stackoverflow.com/questions/359788/javascript-function-name-as-a-string) – epascarello

ответ

2

window[callback1]();

В зависимости от использования я предпочел бы подготовить отдельные функции карты.

var funcMap = { 
    f1: function() {...}, 
    ... 
}; 
funcMap['f4'] = function() {...}; 
function test(callback1) { 
    funcMap[callback1](); 
} 

Это определенно не раздувать window имен и является более безопасным (окно имеет несколько методов, представленных в браузере).

Не используйте eval - это зло!

+0

спасибо gertas – khoailang

0

Вы можете использовать eval() для выполнения функции, которая передается в виде строки. Но его устарел, чтобы использовать eval.

Пример:

function test(someFunctionName) { 
     eval(someFunctionName); 
    } 
+1

eval is evil :) – epascarello

+0

@ epascarello: Я не использовал его когда-либо в производственном коде, поэтому я не знаю, как это зло может быть. Но если многие мудрые люди попробовали это и скажут это, тогда я пойду с ними :) –

+0

если люди скажут прыжок с моста, потому что это самый быстрый путь вниз, вы бы это сделали? :) Eval медленный, eval может привести к проблемам безопасности, и есть лучшие решения. – epascarello

0

написать что-то вроде

function test(callback1) { 
    eval(callback1 + "()"); 
} 

затем callback1 должна быть строка

+1

eval is evil :) – epascarello

+0

Я знаю. Но прагматичный разработчик всегда может предпочесть зло другим трем поискам :) –

+1

Прагматический программист должен также обучать последователей, проводя исследования, что здесь не так сложно. Eval похож на SQL, параметризованный конкатенированными строками. Я не буду называть одного программиста при их использовании. – gertas

2

eval() İŞ ненужный здесь. Чтобы передать обратный вызов, просто передайте имя функции. Функции - это переменные.

Например:

function test(a){ 
    alert(a); 
} 

function callback(b,a){ 
    b(a); 
} 

callback(test, 'dog'); //alerts 'dog' 

Таким образом, в вашем коде, test(f1) будет работать нормально.

Смежные вопросы