передать функцию другому и вызвать по имени - PullRequest
0 голосов
/ 26 июля 2011
<a id="aHw" href="#" callbackName="helloworld">test</a>
    ...
    <script>
      function helloworld() { alert('hello world'); }
    </script>
     ...

вопрос; как я могу создать callBack для передачи другой функции

    <script>
     ...
    var cbName = $('#aHw').attr('callbackName');

    foo( passfunction );  //How???
    ...
   </script>

    <script> 
    function foo(callBack)
    {
       callBack(); // call hello world.
    }
   </script>

спасибо заранее.

Ответы [ 5 ]

3 голосов
/ 26 июля 2011

Функция в JavaScript - это просто объект.

Вопрос (ы) не имеет для меня особого смысла, но учтите следующее:

function fn1 () {
    alert("fn1")
}

function doIt(cb) {
   cb()
}

// direct -- to show point in general
// fn1 evaluates to the function-object, which is then passed
doIt(fn1)

// lookups up fn1 by name, then passes that function-object
// the value "fn1" can be any arbitrary string, such as that which
// was stored in the attr:
//   e.g. doIt(window[cbName])
doIt(window["fn1"])

// anon function to iterate sameness
// the anon function returns a new function-object
doIt(function () { alert("anon") })

Удачного кодирования.

2 голосов
/ 26 июля 2011

Хорошо.Таким образом, чтобы якорь что-то делал в MouseOver, вы должны использовать этот код:

<a id="aHw" href="#" onmouseover="doSomething()">test</a>

Вы можете передать функцию другой функции следующим образом:

function callSomeFunction( fn )
{
    fn();
}

callSomeFunction( alert );

Или вы можете передатьанонимная функция к вышеперечисленному:

 callSomeFunction( function(){ alert( "Finally! A message!" ); } );

Если вы пытаетесь передать имя функции в виде строки (что является принципиально плохой идеей и ужасным риском, трудно поддается отладке и НЕ ДЕЛАЙТЕ ЭТОГО ), тогда вы можете использовать eval:

function callNamedFunction( fn )
{
   eval(fn)()
}

Или вы можете сойти с рук:

function callNamedFunction( fn )
{
   (window[fn])()
}
1 голос
/ 26 июля 2011
foo( Function('return ' + cbName)() )

Я думаю, что это то, что вы после ..

Но если это в браузере, и вы знаете, что обратный вызов является глобальным объектом, вы могли бы сделать ..

foo(window[cbName])
0 голосов
/ 26 июля 2011

Если вы знаете, где определена функция (например, window или пользовательское пространство имен), вы можете вызвать ее по имени строки.В противном случае вам пришлось бы eval (плохая идея).Также используйте data-attributes.

<a href="#" data-callback="helloworld">test</a>

...

// invoke runs a function by name in the provided context, or window
function invoke(cbname, context){
    return (context || window)[cbname].call();
}
// get attribute through the data method
var funcName = $('a').data('callback');

// run callback
var result = invoke(funcName);
0 голосов
/ 26 июля 2011

Ну, если больше ничего не поможет, eval() будет:

function foo( callBack ) {
 eval( callBack + '()' );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...