将方法作为参数传递的语法不同?

时间:2011-07-26 15:30:44

标签: javascript

我目前正在尝试更多地了解javascript,我发现自己绊倒了将方法作为参数传递给另一个方法调用的语法。假设你有两个这样的功能:

    function FirstFunction()
    {
        DoesSomething();
    }


    function SecondFunction(func)
    {
        func();
    }

在实际将FirstFunction传递给SecondFunction时,我似乎看到了各种各样的变化:

    SecondFunction(FirstFunction);

    SecondFunction("FirstFunction()");

或有时,如果FirstFunction定义如下:

    var thisisafunction = function FirstFunction()
    {
        DoesSomething();
    }

    SecondFunction(thisisafunction);

我猜这样做没有“一种正确的方法”,所以什么时候使用每种传递函数的方式都合适?在某种情况下,使用一种方式比另一种方式更好吗?

2 个答案:

答案 0 :(得分:2)

传递字符串总是很糟糕。它只适用于setTimeout这样的函数,它自动eval()字符串,因为它在全局上下文中运行,所以它很糟糕。

如果你只想传递普通函数而不创建闭包或传递参数,那么传递函数而不用 ()就可以了:

myFunc(someCallbackFunc);

如果你需要传递参数或想要一个闭包,那么你可以访问该函数中的一些非全局变量,使用匿名函数:

myFunc(function() {
    someCallbackFunc('meow');
});

当然,您也可以先将函数分配给变量:

var cb = function() {
    someCallbackFunc('meow');
};
myFunc(cb);

虽然var cb = function someName() {};有效,但我建议不要提供函数表达式名称 - 所有浏览器都不支持。唯一的好处是无论如何在调试器中都有一个函数名......

答案 1 :(得分:0)

首先让我清楚一点。您可以将函数定义为:

function name() { ... };

或将其分配给变量

var myFunc = function() { ... };

你不要把两者混合起来

var myFunc = function name() { ... };  //WRONG

因为名称不会绑定到任何内容。

在此之后,将函数作为参数传递的最常用方法是在没有函数调用操作符“()”的情况下传递函数对象,这意味着函数对象不会被执行。

var func1 = function() { console.log("func1 here") };

var func2 = function(f) {  f(); };

func2(func1);

此外,使用函数调用运算符将​​函数作为String传递意味着接收函数必须使用eval()来计算要执行的函数参数。不建议这样做。