如何处理javascript中的嵌套函数?
How to deal with nested functions in javascript?
这可能是一个初学者问题,但我正面临下一种情况:
$(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 函数在 start 函数中没有被很好地调用。我怎样才能做到一切正常?
您目前已经注释掉了关闭 update
函数的 }
,所以说 end f
的行实际上并没有结束 f()
.在目前的状态下,您的代码不会执行。 (我注意到其他人编辑了您的代码,此后此评论不再有效;我不知道编辑是否更接近您的实际代码,或者它是否确实掩盖了真正的错误)
您指的是 multiplecalls
和 multipleCalls
。请注意 javascript 区分大小写。
您正在清除 multipleCalls
,但从未将其设置为 null
。你打算写 multipleCalls = setTimeout(update, 1000)
?
start
,位于 f
之外,将无法访问 update
。在 f()
之外定义 update
及其依赖的函数,或者使其可全局访问,即
window.update = function() { ... }
然后您将能够以 setTimeout(window.update, 1000);
的身份访问
您遇到了范围界定问题。 update
仅在 f
中已知。
您正试图在 start
中从 f
外部调用它。实现此目的的唯一方法是将 function update
公开到与 start
相同的范围,或者将 start
公开到与 update
.[=26= 相同的范围]
第一个选项最简单(也是最丑陋):
function update() {
//...
}
// assign it to the global scope (window is the global scope for browsers)
window.update = update;
现在 update
可从 `starts.
更合适的方法是定义您的处理程序(在 f
范围内调用 start
和 stop
,例如
$(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);
这可能是一个初学者问题,但我正面临下一种情况:
$(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 函数在 start 函数中没有被很好地调用。我怎样才能做到一切正常?
您目前已经注释掉了关闭
update
函数的}
,所以说end f
的行实际上并没有结束f()
.在目前的状态下,您的代码不会执行。 (我注意到其他人编辑了您的代码,此后此评论不再有效;我不知道编辑是否更接近您的实际代码,或者它是否确实掩盖了真正的错误)您指的是
multiplecalls
和multipleCalls
。请注意 javascript 区分大小写。您正在清除
multipleCalls
,但从未将其设置为null
。你打算写multipleCalls = setTimeout(update, 1000)
?start
,位于f
之外,将无法访问update
。在f()
之外定义update
及其依赖的函数,或者使其可全局访问,即window.update = function() { ... }
然后您将能够以
setTimeout(window.update, 1000);
的身份访问
您遇到了范围界定问题。 update
仅在 f
中已知。
您正试图在 start
中从 f
外部调用它。实现此目的的唯一方法是将 function update
公开到与 start
相同的范围,或者将 start
公开到与 update
.[=26= 相同的范围]
第一个选项最简单(也是最丑陋):
function update() {
//...
}
// assign it to the global scope (window is the global scope for browsers)
window.update = update;
现在 update
可从 `starts.
更合适的方法是定义您的处理程序(在 f
范围内调用 start
和 stop
,例如
$(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);