分享更有价值
被信任是一种快乐

JS的闭包与定时器这么实现

文章页正文上

这篇文章主要讲解了“JS的闭包与定时器这么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS的闭包与定时器这么实现”吧!
  什么是闭包?有什么作用
  闭包就是能够读取其他函数内部变量的函数。
  作用:1.可以读取函数内部的变量2.让这些变量的值始终保持在内存中。
  setTimeout0有什么作用
  js运行是基于单线程的,意味着一段代码执行时,其他代码将进入队列等待,一旦线程有空闲就执行后续代码。如果代码中设定了一个setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为0,就代表立即插入队列,但并不是立即执行,仍然要等待前面代码执行完毕(其实有个延时,具体是16ms还是4ms取决于浏览器)。所以setTimeout并不能保证执行的时间,是否及时执行取决于JavaScript线程是拥挤还是空闲。
  代码
  下面的代码输出多少?修改代码让fnArr[i]()输出i。使用两种以上的方法
  varfnArr=[];
  for(vari=0;i

  fnArr[i]=function(){
  returni;
  };
  }
  console.log(fnArr3);//
  代码:
  方法一:
  varfnArr=[];
  for(vari=0;i

  fnArr[i]=(function(){
  varindex=i;
  varfn=function(){
  returnindex
  }
  returnfn
  }());
  }
  console.log(fnArr3);//
  方法二:
  varfnArr=[];
  for(vari=0;i

  (function(n){
  fnArr[i]=function(){
  returnn;
  }
  })(i)
  };
  console.log(fnArr3)
  使用闭包封装一个汽车对象,可以通过如下方式获取汽车状态
  varCar=//todo;
  Car.setSpeed(30);
  Car.getSpeed();//30
  Car.accelerate();
  Car.getSpeed();//40;
  Car.decelerate();
  Car.decelerate();
  Car.getSpeed();//20
  Car.getStatus();//’running’;
  Car.decelerate();
  Car.decelerate();
  Car.getStatus();//’stop’;
  //Car.speed;//error
  代码:
  varCar=(function(){
  varspeed;免费云主机、域名
  functionsetSpeed(n){
  speed=n
  }
  functiongetSpeed(){
  returnconsole.log(speed);
  }
  functionaccelerate(){
  speed+=10
  returnspeed;
  }
  functiondecelerate(){
  speed-=10
  returnspeed;
  }
  functiongetStatus(){
  returnconsole.log(speed===0?’stop’:’running’);
  }
  return{
  setSpeed:setSpeed,
  getSpeed:getSpeed,
  accelerate:accelerate,
  decelerate:decelerate,
  getStatus:getStatus,
  }
  }());
  Car.setSpeed(30);
  Car.getSpeed();//30
  Car.accelerate();
  Car.getSpeed();//40;
  Car.decelerate();
  Car.decelerate();
  Car.getSpeed();//20
  Car.getStatus();//’running’;
  Car.decelerate();
  Car.decelerate();
  Car.getStatus();//’stop’;
  Car.speed();//error
  写一个函数使用setTimeout模拟setInterval的功能
  代码:
  vari=0;
  functionintv(){
  setTimeout(function(){
  console.log(i++);
  intv();
  },1000);
  }
  intv();
  写一个函数,计算setTimeout最小时间粒度
  代码:
  functiongetmin(){
  vari=0;
  varstart=Date.now();
  varclock=setTimeout(function(){
  i++;
  if(i===1000){
  clearTimeout(clock);
  varend=Date.now();
  console.log((end-start)/i)
  }
  clock=setTimeout(arguments.callee,0)
  },0)
  }
  getmin()
  下面这段代码输出结果是?为什么?
  vara=1;
  setTimeout(function(){
  a=2;
  console.log(a);
  },0);
  vara;
  console.log(a);
  a=3;
  console.log(a);
  这段代码的输出结果为1;3;2,因为代码中设定了一个setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为0,就代表立即插入队列,但并不是立即执行,仍然要等待前面代码执行完毕,所以要等代码全部执行完毕后才执行setTimeout(function(){a=2;console.log(a);},0);。
  下面这段代码输出结果是?为什么?
  varflag=true;
  setTimeout(function(){
  flag=false;
  },0)
  while(flag){}
  console.log(flag);
  不会输出结果,因为setTimeout(function(){flag=false;},0)会在所有代码执行完毕后才运行,“flag初始值为true,所以while会一直循环下去,console.log(flag)也不会被访问,但是由于某些浏览器会存在环路保护功能,所以也有可能输出为true“`。
  下面这段代码输出?如何输出delayer:0,delayer:1…(使用闭包来实现)
  for(vari=0;i

  setTimeout(function(){
  console.log(‘delayer:’+i);
  },0);
  console.log(i);
  }
  代码:
  for(vari=0;i

  (function(i){
  setTimeout(function(){
  console.log(‘delayer:’+i);
  },0);
  })(i)
  console.log(i);
  }
  烧脑题
  如下console.log的结果是什么?为什么?
  functionfn(a,b){
  console.log(b);
  return{
  fn:function(c){
  returnfn(c,a);
  }
  };
  }
  vara=fn(0);
  a.fn(1);
  a.fn(2);
  a.fn(3);
  varb=fn(0).fn(1).fn(2).fn(3);
  varc=fn(0).fn(1);
  c.fn(2);
  c.fn(3);
感谢各位的阅读,以上就是“JS的闭包与定时器这么实现”的内容了,经过本文的学习后,相信大家对JS的闭包与定时器这么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是云技术,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: HTML5通用接口有哪些

本篇内容免费云主机、域名介绍了“HTML5通用接口有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1.先说几个基本类型: DOMString, boole…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册