2011-07-25 40 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);