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

如何处理javascript中的嵌套函数?,javascript,function,call,invoke,Javascript,Function,Call,Invoke,这可能是一个初级问题,但我面临的是下一种情况: $(function f() { function test2() { //..... } function GetData() { //..... } function update() { test2(); GetData(); //... }//end update update(); });//end f() function stop() { cle

这可能是一个初级问题,但我面临的是下一种情况:

$(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);
}
当按下按钮且一切正常时,停止功能停止图形。按下按钮时,启动功能应重新启动图形。我的猜测是,在start函数中没有很好地调用update函数。我怎么能做到一切都好呢?

  • 您当前已注释掉关闭
    更新
    函数的
    }
    ,因此表示
    结束f
    的行实际上并没有结束
    f()
    。在当前状态下,代码将不会执行。(我注意到有人编辑了您的代码,之后这句话就不再有效了;我不知道编辑是否更接近您的实际代码,或者它是否确实掩盖了一个真正的错误)

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

  • 您正在清除
    multipleCalls
    ,但从未将其设置为除
    null
    之外的任何值。您是否打算编写
    multipleCalls=setTimeout(更新,1000)

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

    window.update = function() { ... }
    
    然后您可以通过
    setTimeout(window.update,1000)访问它


    • 您有一个范围界定问题。
      更新
      仅在
      f
      中已知

      您正试图在
      start
      中从外部调用它。实现这一点的唯一方法是将
      函数更新
      暴露在与
      开始
      相同的范围内,或者将
      开始
      置于与
      更新
      相同的范围内

      第一种选择最简单(也最丑陋):

      现在,
      update
      可从`开始使用

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

      $(function f() {
        //.. everything there now
      
        $('.start').on('click', function(e) {
          setTimeout(update, 1000);
        });
      });
      
      工作示例

      $(函数f(){
      var timer;//无需为“全局”
      函数更新(){
      $('.result').text(新日期()+'GetData();');
      }
      $('.start')。在('click',function()上{
      //设置计时器之前,请务必清除计时器
      清除超时(计时器);
      //并始终设置一个计时器变量,以便可以取消它
      定时器=设置超时(更新,1000);
      });
      $('.stop')。在('click',function()上{
      //取消计时器
      清除超时(计时器);
      });
      });
      
      开始
      停止
      
      ..
      您可以尝试以下方法:

      window.update = function update() {...} 
      
      然后:

      setTimeout(window.update, 1000);
      

      为什么
      update()
      要调用自己?这并不能直接回答这个问题,但为了以后的参考,我一直被告知嵌套函数的形式应该是var funcname=function(){…}。这两种方法都可以,但它更有条理,看起来更干净。至少应该进行缩进。你猜对了,
      update
      隐藏在
      f
      中,从外部无法访问。什么是
      GetData
      ,它与你的问题有什么关系?那么
      test2
      update
      呢?为什么
      multipleeCall
      从未设置?为什么会有
      multiplecalls
      multiplecalls
      ?请检查是什么。Hedlung这是我对multiplecalls的错误。Rogier,非常感谢你的示例。我有另一种类型的按钮,所以事情有点不同。那么,这些示例是否有助于你理解实际问题和可能的解决方案争议?如果没有,请告诉我如何进一步澄清。
      setTimeout(window.update, 1000);