Maison  >  Article  >  interface Web  >  À propos du problème de portée dans le minuteur en js

À propos du problème de portée dans le minuteur en js

不言
不言original
2018-07-14 16:33:311655parcourir

Cet article présente principalement les problèmes de portée des minuteries en js. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

/*
  各种运动
*/
function Animation(){};
Animation.prototype={    /*     匀速运动   */
     linear:function(obj,target){
        obj.timer=null;
              clearInterval(obj.timer);
                 var step=obj.offsetLeft<target?5:-5;//用位置来判断运动的方向
           if(obj.offsetLeft!=target){
           obj.timer=setInterval(function(){
               var res=target-obj.offsetLeft;//核心好代码  当运动到指定位置的时候差值不会超过5 来作为停止运动的条件
              if(Math.abs(res)<=Math.abs(step)){
                  obj.style.left=target+"px";
                  clearInterval(obj.timer);
               }
               else{
              obj.style.left=obj.offsetLeft+step+"px";
               }
           } ,1000/60);
           
           }
    },
    /*    循环往复运动   */
        loop:function(obj,target){
         var timer=null;
         clearTimeout(timer);
        var fn=arguments.callee.bind(this);//绑定this指向
         if(obj.offsetLeft==target){
               this.linear(obj,0);
            }
         else if(obj.offsetLeft==0){
              this.linear(obj,target);
            }
            /*
             定时器的作用域是全局作用域
             在里面调用的函数都是全局作用域下调用的
            */
           timer=setTimeout(function(){   
           fn(obj,target);
        },900);
           }
}
var animation=new Animation();
刚开始我没有绑定fn的this指向的时候  一直报错

À propos du problème de portée dans le minuteur en js.

Je pensais à ce qui se passait. La fonction est évidemment définie dans Animation et la méthode est également appelée par celle-ci Donc cela devrait pointer vers Animation

Alors j'ai continué à regarder en bas et j'ai vu

Oh, je comprends setTimeout et setInterval

Il s'écrit généralement ainsi

timer=setTimeout(function(){},1000/60);

forme une fermeture. La portée de la fonction ordinaire dans la fermeture est window

, donc si fn est exécuté sous window, alors c'est window

Et linéaire est défini dans Animation, donc la fonction est introuvable et une erreur est signalée

Peu importe si la portée de la fonction fn est liée à Animation

var fn=arguments.callee.bind(this);
当调用loop的时候  this指的就是Animation 
如果没明白  我再举一个简单的例子
var obj={
  age:"17;
}
setInterval(function(){
  
   console.log(this.age);
}.bind(obj),1000);
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !


Recommandations associées :

Analyse des objets DOM en JavaScript

Comment résoudre le plug-in de pagination angulaire- en tm. Le problème du déclenchement secondaire de la pagination

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn