2013-11-29 92 views
0

如何在其他功能中使用fn作爲函數參數? 以及更多,fn參數具有自我參數。如test("b('aa')"),該怎麼辦?如何在其他函數中使用fn作爲函數參數?

JAVASCRIPT

<script type="text/javascript"> 
    function test(fn){ 
     if(fn){ 
      fn(); 
     } 
    } 

    function a(){ 
     alert(1); 
    } 

    function b(x){ 
     alert(x); 
    } 

    /* 
     when click I get errors => TypeError: fn is not a function 
    */ 

</script> 

HTML

<button onclick="test('a')">test('a')</button> 
    <button onclick="test('b(hello)')">test('b(hello)')</button> 
+1

'FN點擊不是函數'當然,這是一個字符串 –

+0

對於第一行,使用'test(a)'而不是'test('a')'。 –

回答

1

簡單地寫這個。

<script type="text/javascript"> 
    function test(fn,parameter){ 
     if(fn){ 
      fn.apply(window,parameter||[]); 
     } 
    } 
    function a(){ 
     alert(1); 
    } 

    function b(x){ 
     alert(x); 
    } 

    /* 
     when click I get errors => TypeError: fn is not a function 
    */ 

</script> 
<button onclick="test(a)">test('a')</button> 
<button onclick="test(b,['hello'])">test('b(hello)')</button> 

感謝Felix Kling的評論。這是解釋。

NOT正確,因爲'b(hello)'是一個字符串對象。

test('b("hello")') 

正確的,因爲你得到的其實是B的返回值(「你好」),這是不確定的。

test(b('hello')) 

要將參數發送到功能測試,必須將fn和參數分開。

可以Function.prototype.apply的使用(thisValueargumentsList)。

正如我寫的東西,

fn.apply(window,parameter||[]) 

Fn功能的這種值窗口爲默認值。

parameter是您的<button>test('b(hello)')</button>元素中的參數列表['hello']。 ||[]防止未定義的變量。 test(a)是沒有實現參數的例子。

+1

您還應該解釋問題和解決方案,而不僅僅是郵政編碼。 –

+1

感謝您的評論。該職位已被修改。 –

2

因爲 'A' IS truthy,但它不是一個功能。這應該工作:

<button onclick="test(a))">test('a')</button>

此外,您在測試條件不應該是if(fn){,它應該是:

if(typeof fn === 'function'){

你可以以這種方式執行的B

<button onclick="test(b.bind(null, 'hello'))">test('b(hello)')</button>

這會通過b功能test以'hello'作爲其第一個參數綁定

+0

好,我正在更新我的答案 –

1

使用jQuery你可以無需代理參數改變功能:

<button onclick="test(a)" /> 
<button onclick="test($.proxy(b,window,'hello')" /> 

或者功能中,您可以測試B的artiy

if (x.arity>0){ 
    x(arguments[1]) 
} 

test(b,'hello');

相關問題