开发者

pass function to another and call by name

<a id="aHw" href="#" callback开发者_如何学GoName="helloworld">test</a>
    ...
    <script>
      function helloworld() { alert('hello world'); }
    </script>
     ...

question ; how can i produce callBack to pass another function

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

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

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

thanks in advance.


A function in JavaScript is just an object.

The question(s) don't make terribly much sense to me, but consider the following:

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

Happy coding.


Ok. So to have an anchor do something on MouseOver, you'd use this code:

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

You can pass a function to another function this way:

function callSomeFunction( fn )
{
    fn();
}

callSomeFunction( alert );

Or you can pass an anonymous function to the above:

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

If you're trying to pass the name of a function as a string (which is a fundamentally bad idea and a terrible risk and hard to debug and DON'T DO IT), then you can use eval:

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

Or you might be able to get away with:

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


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

I think that's what your after..

But if it's in the browser, and you know that the callback is a global object, you could do..

foo(window[cbName])


Well, if nothing else helps, eval() will:

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


If you know where the function is defined (e.g window, or custom namespace) you can invoke it by the string name. Otherwise you would have to eval (bad idea). Also, use 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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜