如何在javascript中处理嵌套函数?

时间:2016-02-18 11:20:33

标签: javascript function call invoke

这可能是一个初学者问题,但我面临下一个情况:

$(function f() {

  function test2() {
    //.....
  }

  function GetData() {
    //.....
  }    
  function update() {
    test2();
    GetData();
    //...
  }//end update

  update();

});//end f()

function stop() {
  clearInterval(multipleCalls);
}

function start() {
  multipleCalls=null; //this is a global variable
  setTimeout(update, 1000);
}

当按下按钮并且一切正常时,停止功能会停止图形。按下按钮时,启动功能应重新启动图形。我的猜测是在启动函数中没有很好地调用更新函数。我怎么能这样做才能正常工作?

3 个答案:

答案 0 :(得分:1)

  • 您目前已注释掉关闭}功能的update,因此显示end f的行实际上并未结束f() 。在其当前状态下,您的代码将不会执行。 (我注意到其他人编辑了您的代码,之后此评论不再有效;我不知道编辑是否更接近您的实际代码,或者它是否确实模糊了真正的错误)

  • 您指的是multiplecallsmultipleCalls。请注意,javascript区分大小写。

  • 您正在清除multipleCalls,但从未将其设置为null以外的任何内容。您打算写multipleCalls = setTimeout(update, 1000)吗?

  • start被置于f之外,无法访问update。定义update及其依赖于f()之外的函数,或使其可全局访问,即

    window.update = function() { ... }
    

    然后您可以访问setTimeout(window.update, 1000);

答案 1 :(得分:1)

您有一个范围问题。 update仅在 f

中已知

您正尝试在f内的start外拨打电话。实现此目的的唯一方法是将function update公开到与start所在的范围相同的范围,或将startupdate放在同一范围内。

第一个选项最简单(也是最丑陋):

function update() {
  //...
}
//  assign it to the global scope (window is the global scope for browsers)
window.update = update;

现在可以从`starts。

获得update

更合适的方法是定义处理程序(在start范围内调用stopf,例如

$(function f() {
  //.. everything there now

  $('.start').on('click', function(e) {
    setTimeout(update, 1000);
  });
});

工作示例



$(function f() {
  var timer;  //  no need to be 'global'
  
  function update() {
     $('.result').text(new Date() + ' GetData();');
  }

  $('.start').on('click', function() {
    //  always clear a timer before setting it
    clearTimeout(timer);
    //  and always set a timer variable, so it can be cancelled
    timer = setTimeout(update, 1000);
  });

  $('.stop').on('click', function() {
    //  cancel the timer
    clearTimeout(timer);
  });
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button class=start>start</button>
<button class=stop>stop</button>

<div class=result>..</div>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

你可以试试这个:

window.update = function update() {...} 

然后:

setTimeout(window.update, 1000);