如何在其他函数中使用fn作为函数参数?

时间:2013-11-29 06:51:02

标签: javascript

如何在其他功能中使用 fn 作为功能参数? 而且, fn 参数具有自参数。比如test("b('aa')"),怎么办?

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>

3 个答案:

答案 0 :(得分:2)

因为'a' IS 真实,但它不是一个功能。这应该有效:

<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'绑定为其第一个参数

答案 1 :(得分: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('hello')的返回值,这是未定义的。

test(b('hello'))

要将参数发送到功能测试,必须将fn和参数分开。

您可以使用Function.prototype.apply( thisValue argumentsList )。

正如我所写,

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

fn函数的 值是默认窗口。

parameter<button>test('b(hello)')</button>元素中['hello']的参数列表。 ||[]阻止未定义的变量。 test(a)是没有实现参数的示例。

答案 2 :(得分:1)

使用jQuery,您可以代理参数而无需更改函数:

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

或者在功能中你可以测试b的艺术

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

并点击test(b,'hello');