何时使用匿名函数

时间:2012-01-07 20:50:01

标签: javascript

我有一个对象ajax_tryit,它调用ajax_generic ans发送它3个函数。他们都被命名了。

使用匿名函数会更好(效率更高,速度更快)。

应用程序...这是ajax回调函数,可以执行3项操作,传递,失败或未定义(通常是php错误)。

function ajax_generic( server_response_text, pass_func, fail_func, undefined_func )
{
    var aml_status = check_aml( server_response_text.slice( 0, 6 ) );
    if( aml_status === Constant.AML.PASS )
    {
        pass_func();
    }
    else if( aml_status === Constant.AML.FAIL )
    {
        fail_func();
    }
    else
    {
        undefined_func();
    }
}
function ajax_tryit( server_response_text, html_div )
{
    var pass_func = function {window.location.reload()};
    var fail_func = function(server_response_text) { alert( 'ajax_tryit(): ' + server_response_text ) } ;
    var undefined_func = function(server_response_text) { alert( 'php error: ' + server_response_text ) };
    ajax_generic( pass_func, fail_func, undefined_func );
}

3 个答案:

答案 0 :(得分:6)

命名函数(即使用函数声明语句创建的函数)实际上非常好,因为您可以在堆栈跟踪中看到它们的名称。除此之外,只要函数在适当的范围内声明(或者范围无关紧要),它就没那么重要了。

在函数定义表达式中为函数命名在技术上是合法的,但这不是一个好主意,因为各种JavaScript引擎can't be trusted not to do something weird

答案 1 :(得分:4)

它总是取决于哪个更清楚,所以在这种情况下我会说答案是没有。现在你有相当具有描述性的名字。将它们取出会使代码难以维护,并且会使缩进变得混乱。他们不会因为有名字而造成任何问题。

但是,您可以改变的一点是缩进和语法:

function ajax_tryit(server_response_text, html_div) {
    function pass_func() {
        window.location.reload()
    }

    function fail_func(server_response_text) {
        alert('ajax_tryit(): ' + server_response_text)
    }

    function undefined_func(server_response_text) {
        alert('php error: ' + server_response_text)
    }

    ajax_generic(pass_func, fail_func, undefined_func);
}

编辑:此外,在回复您的评论时:

  

保存3个变量......效率更高。

不,不使用变量效率不高,尤其是在这里。别担心。

答案 2 :(得分:1)

当您需要将变量传递给回调函数或更改范围时,可以使用Anon函数

示例(将参数传递给回调函数):

var somevar = "test";

setInterval( function()
{
    test(somevar);
},5000);

function test(Msg)
{
    alert(Msg);
}

如果你刚刚完成

setInterval(test,5000);

你会得到一个空白的警告框,非常简化的例子。

对于changing scope,请查看给出的答案,其中显示了需要更改范围的示例。

但除此之外,没有真正需要为匿名函数切换命名函数。