Javascript从嵌套函数中调用外部函数

时间:2012-12-03 05:31:49

标签: javascript function function-calls nested-function

拥有我认为应该是一个相对容易的问题,以应对是一个重大的痛苦......我正在努力:

a.b("param", function(data)
{
     logger.debug("a.b(" + data.toString() + ")");

     if (data.err == 0)
     {
           // No error, do stuff with data
     }
     else
     {
           // Error :(  Redo the entire thing.
     }
});

我的方法是尝试:

var theWholeThing = function() {return a.b("param", function(data)
{
     logger.debug("a.b(" + data.toString() + ")");

     if (data.err == 0)
     {
           // No error, do stuff with data
     }
     else
     {
           // Error :(  Redo the entire thing.
           theWholeThing();
     }
})};

上面的问题是前者确实有效(除非在发生错误时没有处理),后者根本就不会打印日志消息......就好像“theWholeThing()”调用不能正常工作一样认为它应该(再次调用整个事物)。

这里肯定有一些巧妙的错误,任何提示?

谢谢!

2 个答案:

答案 0 :(得分:4)

首先,直接回答你的问题,听起来好像你第一次忘记实际调用该函数。尝试:

var theWholeThing = function() {return a.b("param", function(data)
{
     logger.debug("a.b(" + data.toString() + ")");

     if (data.err == 0)
     {
           // No error, do stuff with data
     }
     else
     {
           // Error :(  Redo the entire thing.
           theWholeThing();
     }
})};

theWholeThing(); // <--- Get it started.

但是,在命名的IIFE(立即调用函数表达式)中可以更优雅地实现这一点:

// We wrap it in parentheses to make it a function expression rather than
// a function declaration.
(function theWholeThing() {
    a.b("param", function(data)
    {
         logger.debug("a.b(" + data.toString() + ")");

         if (data.err == 0)
         {
               // No error, do stuff with data
         }
         else
         {
               // Error :(  Redo the entire thing.
               theWholeThing();
         }
    });
})(); // <--- Invoke this function immediately.

答案 1 :(得分:0)

如果将方法分开并使用变量来表示,事情就会变得清晰。您只需要将a.b和匿名函数视为方法参考。我认为这段代码示例可以提供帮助:

var theWholeThing = a.b, //this is a reference of b method
    par = "param",
    callback = function(data){
     logger.debug("a.b(" + data.toString() + ")");

     if (data.err == 0)
     {
           console.log("no error");    
     }
     else
     {
           console.log("Error");
           // theWholeThing reference can be accessed here and you can pass your parameters along with the callback function using variable name 
           theWholeThing("param", callback); 
     }
}; //declare the callback function and store it in a variable

theWholeThing("param", callback); //invoke it