onclick和闭包

之前我的文章提到调用外部闭包的函数,并不会触发里面的匿名的函数.只会返回函数体.但是一位热心的读者说不是这样,他说下面这段代码就是调用外部函数也直接运行了匿名函数.


      <script type="text/javascript">
          function move(speed){ 
              return function(){ 
                  box.style.left = box.offsetLeft + speed + "px";
              }
          }
          btn1.onclick = move(-20);
          btn2.onclick = move(20);
      </script>
这个时候不仅调用了外层的函数,同时也运行了里面的函数.但是,有一个特殊的地方就是,加了一个onclick绑定事件. 让我们看一看没有onclick绑定时候的情况.

      function move(speed){
          return function(){
              box.style.left = box.offsetLeft + speed + "px";
              console.log("I am function")
          }
      }
          move(200);
  • 这个时候,普通的调用的时候 却没有触发function.也没有输出 "I am function".点击也没有任何效果

  • 所以在普通情况下, 闭包中匿名的函数没有被调用. 但是涉及到类似onclick的绑定事件.就直接调用了.我认为原因如下

          window.onload=function () {
          var a=document.getElementById("a")
          function c(){
            alert(1);
          }
          function b(){
            alert(2);
          }
          a.onclick=c();b();
          }
    

onClick可以同时绑定两个函数,甚至两个以上. 所以在上面那段代码事件可能是这样

        btn1.onclick = move(-20);function(){ box.offsetLeft+speed+"px"}
  • 实际调用了move()和全局的匿名的函数.
posted @ 2017-03-08 15:22  MaxProAim  阅读(938)  评论(0编辑  收藏  举报