使用javascript调用嵌套函数

时间:2011-08-27 06:27:47

标签: javascript

我有这个代码在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()函数?

7 个答案:

答案 0 :(得分:5)

这些嵌套函数的范围仅限于test函数。你不能从外面调用它们。如果您需要这样做,可以从test函数外化它。

答案 1 :(得分:4)

这是一个'封闭'问题。函数StopAlltest函数的范围内,因此在您尝试调用它的全局范围内未定义。

封闭是最初难以理解的主题。这里有一个很好的解释: 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]);
    }

功能声明可以在外面给出并在任何你想要的地方调用