【问题标题】:When to use anonymous functions何时使用匿名函数
【发布时间】:2012-01-07 20:50:01
【问题描述】:

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

使用匿名函数会更好(更高效,更快一点)吗?

Application...这是 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 个变量..这样效率更高。

标签: javascript


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    不过,您可以更改的一件事是缩进和语法:

    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 个变量..这样效率更高。

    不,不使用变量并不是更有效,尤其是在这里。不用担心。

    【讨论】:

      【解决方案3】:

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

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

      var somevar = "test";
      
      setInterval( function()
      {
          test(somevar);
      },5000);
      
      function test(Msg)
      {
          alert(Msg);
      }
      

      如果你刚刚完成了

      setInterval(test,5000);
      

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

      对于changing scope,请查看那里给出的答案,它显示了何时需要更改范围的示例。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        • 1970-01-01
        • 2014-08-16
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        相关资源
        最近更新 更多