问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript的一个闭包和延时器问题,怎么解决?

发布网友 发布时间:2022-04-27 05:47

我来回答

3个回答

懂视网 时间:2022-05-12 15:52

这次给大家带来JS的闭包与定时器,使用JS的闭包与定时器的注意事项有哪些,下面就是实战案例,一起来看一下。

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

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

代码

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

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

代码:
方法一:

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

方法二:

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

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

var Car = //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

代码:

var Car = (function(){
var speed;
function setSpeed(n){
speed = n
}
function getSpeed(){
return console.log(speed);
}
function accelerate(){
speed +=10
return speed;
}
function decelerate(){
speed -=10
return 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(); //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的功能
代码:

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(){
i++;
if(i === 1000){
clearTimeout(clock);
var end = Date.now();
console.log((end-start)/i)
}
clock = setTimeout(arguments.callee,0)
},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;
},0)
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<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}

代码:

for(var i=0;i<5;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);

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

相关阅读:

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

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

热心网友 时间:2022-05-12 13:00

js的延时实在setTimeout函数中调用的,但是不能有alert出现。
比如:
for(var i=1;i<=3;i++){
(function(i){
setTimeout(function(){
alert(i);
},10000);
})(i);
}

以上要把alert改成console.log就没问题了。alert会影响定时器的调度。
所以,通常调试js时,这个问题也是大多数人容易犯的错误。

热心网友 时间:2022-05-12 14:18

10秒之后也可能出现123,这个是随机的,取决于调度算法,不能依赖于这个顺序。
把alert改成console.log就没问题了。
alert会影响定时器的调度。
所以,通常调试js时,这个问题必须注意。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
YY聊天中哪些语音的会不会作为文件存下来 2023谷雨节气的含义 谷雨三候是什么 我老公欠债,外遇,我想离婚,怎么办 ...我提供了我的姓名,出生年月日,还有工作地点,会出什么事吗... 刚刚接到一个诈骗电话,问我要了我的姓名和出生年月日,会不会利用... 不小心接到骗子的电话,还告诉了我的姓名和出生年月日,要不要紧啊... 知道了姓名和出生年月日,能拿来作案吗? WOW安装要CD 是什么问题? 急急急、、、魔兽世界用盘安装时老要CD片 时怎么回事 取消以后就安装不... 每次下载魔兽世界安装中途都会断掉,要求插入什么CD,然后出现这么一段文... 起好听的古人名字 好听的名字(古代) 有哪些好听的古人名字? 一群红领围了过来,不一会儿就帮这位小姑娘把苹果捡了起来,用了什么手法 QQ高级群红色消失 小弟弟旁边一群红的,很痒 我建的高级群红色的怎么变成不红了、我会员掉了2个月 可是还是VIP4 怎么在亮啊! 怀化大峡谷和群红山庄哪个离怀化高铁站近点? 罗刹魂有普通群红吗? 导演组对群红呼喻六小龄童上春晚最新建意 上海群红园林绿化工程有限公司怎么样? 龙游群红家庭农场怎么样? 群红山庄 的游乐设施怎么写10字 怀化群红农庄住宿多少钱一晚 圆月新增魄清香得好风满田生火齐佳种是群红 翻译? 托口群红农庄门票多少 抖音里多选建群红√是啥意思 群红农庄玩两天一晚多少钱 我的苹果手机从桌子上掉下来了,然后一直黑屏是怎么回事啊? 三个风筝的线都是30米长,1风筝与地面所形成的角25度,2风筝与地面所形成的角55度,3风筝与地面 起优雅的古代名字 js延时器setTimeout(,)把第一个参数直接设置为一段函数,第二个参数就... javascript 定时器如何使用?涉及到得函数有哪些? javascript 延时显示隐藏DIV 求一些好听的古代女子名,男子名,丫头名。 js html 问题,急求一明白人,延时器为什么不好用。 要写小说词穷,想不出好名字所以要一些好听的古代男女的名字 js clearTimeout不起作用怎么回事,关不了那个定时器 继电器js7 原理是什么?如何调整延时范围? jQuery hover 延时器实现代码 好听的古代人名 javascript怎样给这个代码加上个定时器让它延时500毫秒显示呢?_百度... JavaScript提供了哪些定时器? js定时器的准确时间? js定时器怎么写? 玉手镯是纯色的好,还是多色的好 js中怎样能让定时器立刻执行? 翡翠手镯上有绿、黄、紫&nbsp;三种颜色好,还是只有一种颜色好呢? 玉手镯中有很多颜色是好的吗,哪种的比较好啊 玉镯的哪种颜色比较好?