我目前正在尝试更多地了解javascript,我发现自己绊倒了将方法作为参数传递给另一个方法调用的语法。假设你有两个这样的功能:
function FirstFunction()
{
DoesSomething();
}
function SecondFunction(func)
{
func();
}
在实际将FirstFunction传递给SecondFunction时,我似乎看到了各种各样的变化:
SecondFunction(FirstFunction);
或
SecondFunction("FirstFunction()");
或有时,如果FirstFunction定义如下:
var thisisafunction = function FirstFunction()
{
DoesSomething();
}
SecondFunction(thisisafunction);
我猜这样做没有“一种正确的方法”,所以什么时候使用每种传递函数的方式都合适?在某种情况下,使用一种方式比另一种方式更好吗?
答案 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()来计算要执行的函数参数。不建议这样做。