我有这个代码在body onload上调用函数test()
<body onLoad="test();">
Test函数还有2个函数drawLayers(),StopAll()。
function test() {
function drawLayers() {
timers = [];
timers.push(setTimeout(drawMoon,800));
timers.push(setTimeout(drawCircle1,2300));
timers.push(setTimeout(drawCircle2,2700));
timers.push(setTimeout(drawCircle3,3100));
timers.push(setTimeout(drawCircle4,3500));
timers.push(setTimeout(drawCircle5,3900));
timers.push(setTimeout(drawtext2,4300));
timers.push(setTimeout(drawtext,4700));
timers.push(setTimeout(drawtext3,5100));
timers.push(setTimeout(drawtext4,5500));
timers.push(setTimeout(drawtext5,5900));
timers.push(setTimeout(drawtext6,6300));
timers.push(setTimeout(drawtext7,6700));
timers.push(setTimeout(drawtext8,7100));
timers.push(setTimeout(drawtext9,7500));
timers.push(setTimeout(drawtext10,7900));
}
function StopAll() {
alert('fsdfsdf');
for (var i = 0; i < timers.length; i++)
window.clearTimeout(timers[i]);
}
}
我想要做的是点击一个按钮调用StopAL()函数,html代码如下所示
<a href="javascript:void(0);" onClick="StopAll();">
抛出错误,“StopAll未定义”
如何调用StopALL()函数?
答案 0 :(得分:5)
这些嵌套函数的范围仅限于test
函数。你不能从外面调用它们。如果您需要这样做,可以从test
函数外化它。
答案 1 :(得分:4)
这是一个'封闭'问题。函数StopAll
在test
函数的范围内,因此在您尝试调用它的全局范围内未定义。
封闭是最初难以理解的主题。这里有一个很好的解释: How do JavaScript closures work?
(顺便说一句,StopAll
应该被称为stopAll
,因为大写的函数通常会保留用于new
关键字。)
答案 2 :(得分:3)
test = function (){
this.drawLayers = function() {
this.timers = [];
this.timers.push(setTimeout(drawMoon,800));
}
this.StopAll = function() {
alert('fsdfsdf');
var t = timers.length
for (var i = 0; i < t; i++)
window.clearTimeout(this.timers[i]);
}
}
var testObj = new test();
testObj.StopAll()
答案 3 :(得分:2)
function test() {
function drawLayers() {
timers = [];
timers.push(setTimeout(drawMoon,800));
timers.push(setTimeout(drawCircle1,2300));
timers.push(setTimeout(drawCircle2,2700));
}
var StopAll=function() {
alert('fsdfsdf');
for (var i = 0; i < timers.length; i++)
window.clearTimeout(timers[i]);
}
return StopAll;
}
var obj= new test();
//to call StopAll function
obj();
答案 4 :(得分:1)
(function test($) {
function drawLayers() {
}
//expose this to outside world ,public function
$.StopAll = function() {
alert('fsdfsdf');
}
})(window);
StopAll();
答案 5 :(得分:0)
您最好不要使用html属性来绑定事件处理程序,您可以使用以下代码执行相同的操作:
window.onload = function(){
document.getElementById("myLink").onclick = function(){
StopAll();
}
}
// Your functions
这样你就可以确保你的dom已加载并准备好调用事件处理程序。
答案 6 :(得分:0)
您可以将函数StopAll()移到测试函数之外并按指定调用它。如果假设你甚至需要在test()中访问该函数,你可以这样做
function test() {
.....
drawLayers();
StopAll() ;
}
function StopAll() {
alert('fsdfsdf');
for (var i = 0; i < timers.length; i++)
window.clearTimeout(timers[i]);
}
功能声明可以在外面给出并在任何你想要的地方调用