2011-07-25 36 views
0
<a id="aHw" href="#" callbackName="helloworld">test</a> 
    ... 
    <script> 
     function helloworld() { alert('hello world'); } 
    </script> 
    ... 

问题;我怎么能生产回调传递另一个功能将功能传递给另一个,并按名称呼叫

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

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

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

在此先感谢。

回答

2

确定。所以有一个锚做鼠标悬停的东西,你会使用此代码:

<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])() 
} 
+0

你不推荐,但我必须这样做! :) 真的感谢。 –

3

JavaScript中的函数只是一个对象。

的问题(S)不要让可怕多大意义,我,但考虑以下因素:

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
foo(Function('return ' + cbName)()) 

我认为这是你的以后。

但如果它是在浏览器中,你知道,回调是一个全局对象,你可以做什么..

foo(window[cbName]) 
0

好如果没有别的帮助,eval()将:

function foo(callBack) { 
eval(callBack + '()'); 
} 
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);