将函数传递给另一个函数并按名称调用

时间:2011-07-25 21:15:47

标签: jquery-plugins jquery

<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 个答案:

答案 0 :(得分:3)

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") })

快乐的编码。

答案 1 :(得分:2)

确定。因此,要让一个锚在MouseOver上执行某些操作,您可以使用以下代码:

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

您可以通过这种方式将函数传递给另一个函数:

function callSomeFunction( fn )
{
    fn();
}

callSomeFunction( alert );

或者您可以将匿名函数传递给上述函数:

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

如果你试图将一个函数的名称作为一个字符串传递(这是一个根本不好的想法和一个可怕的风险,很难调试, 不要做它 < / strong>),那么你可以使用eval:

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

或者你可以逃脱:

function callNamedFunction( fn )
{
   (window[fn])()
}

答案 2 :(得分:1)

foo( Function('return ' + cbName)() )

我认为这就是你的事后......

但如果它在浏览器中,并且您知道回调是一个全局对象,那么您可以这样做..

foo(window[cbName])

答案 3 :(得分:0)

好吧,如果没有其他帮助,eval()将:

function foo( callBack ) {
 eval( callBack + '()' );
}

答案 4 :(得分:0)

如果您知道函数的定义位置(例如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);