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的绝对值。感谢您提供如此全面的答案!外部范围工作得非常好。谢谢你