首页 > 开发 > JavaScript > 正文

JS的闭包与定时器

2020-03-24 17:09:42
字体:
来源:转载
供稿:网友
这次给大家带来JS的闭包与定时器,使用JS的闭包与定时器的注意事项有哪些,下面就是实战案例,一起来看一下。

什么是闭包? 有什么作用
闭包就是能够读取其他函数内部变量的函数。
作用:1.可以读取函数内部的变量2.让这些变量的值始终保持在内存中。

setTimeout 0 有什么作用
js运行是基于单线程的,意味着一段代码执行时,其他代码将进入队列等待,一旦线程有空闲就执行后续代码。如果代码中设定了一个setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为 0,就代表立即插入队列,但并不是立即执行,仍然要等待前面代码执行完毕(其实有个延时,具体是16ms还是4ms取决于浏览器)。所以setTimeout并不能保证执行的时间,是否及时执行取决于 JavaScript 线程是拥挤还是空闲。

代码

下面的代码输出多少?修改代码让fnArr[i]()输出 i。使用两种以上的方法

var fnArr = [];for (var i = 0; i i ++) {fnArr[i] = function(){return i;console.log( fnArr3 ); //

代码:
方法一:

var fnArr = [];for (var i = 0; i i ++) {fnArr[i] = (function(){var index = i;var fn = function(){return indexreturn fn}());console.log( fnArr3 ); //

方法二:

var fnArr = [];for (var i = 0; i i ++) {(function(n){fnArr[i] = function(){return n;})(i)console.log( fnArr3 )

使用闭包封装一个汽车对象,可以通过如下方式获取汽车状态

var Car = //todo;Car.setSpeed(30);Car.getSpeed(); //30Car.accelerate();Car.getSpeed(); //40;Car.decelerate();Car.decelerate();Car.getSpeed(); //20Car.getStatus(); // running Car.decelerate();Car.decelerate();Car.getStatus(); // stop //Car.speed; //error

代码:

var Car = (function(){var speed;function setSpeed(n){speed = nfunction getSpeed(){return console.log(speed);function accelerate(){speed +=10return speed;function decelerate(){speed -=10return speed;function getStatus(){return console.log(speed===0? stop : running return {setSpeed:setSpeed,getSpeed:getSpeed,accelerate:accelerate,decelerate:decelerate,getStatus:getStatus,}());Car.setSpeed(30);Car.getSpeed(); //30Car.accelerate();Car.getSpeed(); //40;Car.decelerate();Car.decelerate();Car.getSpeed(); //20Car.getStatus(); // running Car.decelerate();Car.decelerate();Car.getStatus(); // stop Car.speed(); //error

写一个函数使用setTimeout模拟setInterval的功能
代码:

var i=0;function intv(){setTimeout(function(){console.log(i++);intv();},1000);intv();

写一个函数,计算setTimeout最小时间粒度
代码:

function getmin(){var i = 0;var start = Date.now();var clock = setTimeout(function(){if(i === 1000){clearTimeout(clock);var end = Date.now();console.log((end-start)/i)clock = setTimeout(arguments.callee,0)getmin()

下面这段代码输出结果是? 为什么?

var a = 1;setTimeout(function(){a = 2;console.log(a);}, 0);var a ;console.log(a);a = 3;console.log(a);

这段代码的输出结果为1;3;2,因为代码中设定了一个setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为 0,就代表立即插入队列,但并不是立即执行,仍然要等待前面代码执行完毕,所以要等代码全部执行完毕后才执行setTimeout(function(){a = 2;console.log(a);}, 0);。

下面这段代码输出结果是? 为什么?

var flag = true;setTimeout(function(){flag = false;while(flag){}console.log(flag);

不会输出结果,因为setTimeout(function(){flag = false;},0)会在所有代码执行完毕后才运行,``flag初始值为true,所以while会一直循环下去,console.log(flag)也不会被访问,但是由于某些浏览器会存在环路保护功能,所以也有可能输出为true```。

下面这段代码输出?如何输出delayer: 0, delayer:1...(使用闭包来实现)

for(var i=0;i i++){setTimeout(function(){console.log( delayer: + i );}, 0);console.log(i);}

代码:

for(var i=0;i i++){(function(i){setTimeout(function(){console.log( delayer: + i );}, 0);})(i)console.log(i);}

烧脑题

如下console.log的结果是什么?为什么?

function fn(a,b) {console.log(b);return {fn:function(c){return fn(c,a);var a = fn(0);a.fn(1);a.fn(2);a.fn(3);var b = fn(0).fn(1).fn(2).fn(3);var c = fn(0).fn(1);c.fn(2);c.fn(3);

相信看了本文案例你已经掌握了方法,更多精彩请关注php 其它相关文章!

相关阅读:

简易的CSS3点击响应动画案列

如何使用python来判断图片相似度

以上就是JS的闭包与定时器的详细内容,html教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表