如何处理 javascript 中的嵌套函数

How to deal with nested functions in javascript?

本文关键字:嵌套 函数 javascript 何处理 处理      更新时间:2023-09-26

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

$(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);
}
停止

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

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

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

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

  • start被放置在f之外,将无法访问update。要么定义update及其在f()之外依赖的功能,要么使其全局可访问,即

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

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

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

您正在尝试从外部f start调用它.实现此目的的唯一方法是将function update公开到与start所在的范围相同的范围,或者将start带到与update相同的范围。

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

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

现在update可从"开始"获得。

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

$(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>

你可以试试这个:

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

然后:

setTimeout(window.update, 1000);