JavaScript:跨多个函数携带时间变量

JavaScript:跨多个函数携带时间变量,javascript,Javascript,我试图得到一个函数在第二个函数中执行的时间差 然而,我知道最好的方法是什么。我考虑的是一个全局变量,但是考虑到第二个函数中需要的变量是第一个函数执行的时间,我不确定该变量如何工作 这是我的密码: var d = new Date(); function myFunction(A) { // execute function A var functionAExecuted = d.getMilliseconds(); } function myFunction(B) {

我试图得到一个函数在第二个函数中执行的时间差

然而,我知道最好的方法是什么。我考虑的是一个全局变量,但是考虑到第二个函数中需要的变量是第一个函数执行的时间,我不确定该变量如何工作

这是我的密码:

var d = new Date(); 

function myFunction(A) {
   // execute function A
   var functionAExecuted = d.getMilliseconds();

}

function myFunction(B) {
   // Execute function B
   var functionBExecuted = d.getMilliseconds();
   var diff = functionAExecuted - functionBExecuted;

   if (diff > 3000) {
   //do something
   }


}

它不会执行,因为
functionexecuted
不会传递到第二个函数。最好的方法是什么?

我将第一个值存储在一个表单中,然后在第二个函数中检索它:

var d = new Date(); 

function myFunction(A) {
   var functionAExecuted = d.getMilliseconds();
   // do something
   document.forms.myForm.timeStorageFunctionA.value = functionAExecuted;
}
现在可以访问d.GetMillimess():

function myFunction(B) {
    var functionBExecuted = new Date().getMilliseconds();
    var functionAExecuted = document.forms.myForm.timeStorageFunctionA.value;
    var diff = functionAExecuted - functionBExecuted;

    if (diff > 3000) {
        //do something else
    }
}

这里有两件事:

  • 首先,您使用相同的
    Date
    对象来测量每个函数的开始时间。问题是
    Date
    对象表示固定状态,即实例化时的确切时间。因此,对
    getmillizes()
    的两个单独调用将返回相同的值,无论何时调用
  • 您的两个函数试图访问彼此的局部变量,我相信您知道,除非它们作为参数相互传递,否则这是不可能的
  • 在实际运行
    myFunction(A)
    之前,您正在重新定义您的
    myFunction
    。这是因为JavaScript命名函数声明被提升(连同它们的定义)到封闭上下文的顶部,这意味着
    myFunction(A)
    的功能将始终被
    myFunction(B)
    的功能替换,然后才有机会调用任何一个函数。我建议您分别命名每个函数,然后进行测试。
    • 有关功能提升的更多信息,请查看以下精彩摘要:
  • 作为替代,考虑重命名函数并使用外部范围保存两次,并计算事实后的差异:

    var times = {};
    
    function myFunctionA(a) {
      times.functionA = new Date();
      // do something
    }
    
    function myFunctionB(b) {
      times.functionB = new Date();
    
      var diff = times.functionB.getMilliseconds() - times.functionA.getMilliseconds();
    
      if (diff > 3000) {
        //do something else
      }
    }
    

    除了关于什么是实现这一点的最佳方法的参数外,作为旁注,
    functionexecuted
    不会带到第二个函数,因为您在其中定义它的范围。您可以在定义
    d
    的相同范围内定义
    functionexecuted
    ,然后在
    myFunction(A)
    中为其设置值,因此当
    myFunction(B)
    执行
    functionexecuted
    时,它将可用。另外请注意,如果函数B是调用的第二个函数,则需要diff=B-A,或者,如果您保持代码不变,您将需要diffs的绝对值。感谢您提供如此全面的答案!外部范围工作得非常好。谢谢你