为了账号安全,请及时绑定邮箱和手机立即绑定

setInterval setTimeout 定时器;边界动画判断

标签:
JavaScript
**一,定时器**
setInterval:每间隔多久执行一次; clearTimeout clearInterval
setTimeout:只执行一次;

(1)window.setInterval(fn,time,opation):支持三个参数,第三个参数的值是在函数执行的时候传递的实参值;(ie9及以下不兼容)

(2)关于定时器this和传参的问题;
    定时器里面的this是window;改变定时器里面的this我们用bind;
    bind不兼容ie6-8
    bind:改变this,传递参数,但是函数不会执行,我们只是提前修改了函数中的this、
    setTimeout(function(){}.bind(this,参数),500);

    兼容定时器函数传递参数,改变this的方法;
    //利用闭包保存机制,来形成一个不销毁的作用域,来保存this和参数,
    var obj={name:100}
    window.setTimeout(sum.call(obj,100),500)
    function sum(name) {
        var that = this;
            return function () {
               console.log(that);
                console.log(name)
            }
     }
(3)定时器的返回值
    设置定时器都会有返回值,返回值是一个数字,代表当前是第几个定时器;随着设置定时器的增多,我们的数字也会增加;(ie中的定时器关闭浏览器返回值不会关闭)
clearTimeout(Number),clearTimout(number)

    当我们把页面中的某一个定时器清除以后,后面的排序好不会发生改变,当在设置一个定时器,会基于最后一个累加,(银行排好办业务一样)

    把浏览器关闭重新打开定时器返回值是从开始;

(4)定时器递归
    var n=0;
    var timer = null
    timer=window.setTimeout(fn,1000)
    function fn() {
        clearTimeout(timer)// 把上一次的定时器的返回值定时器清除掉
        n++
        if (n>5) {
            clearTimeout(timer);
            return;
        }
        timer=window.setTimeout(fn,1000) 
    }

(5)定时器的异步和同步(主任务和等待任务)(sync同步    async异步)
    **异步编程**:一个任务需要等待一会在做,我们先把它放在等待任务队列中,主任务执行完成后,才能去等待任务中执行之前等待的任务;
    **同步编程**:在主任务当列中,代码从上到下依次执行,上面的执行完后,才往下执行;

    异步:所有的定时器,ajax请求,事件绑定,都是异步编程;(js编程中严禁格式3种)
    定时器设置的等待时间是0,也不会理解执行,浏览器在执行的时候,都需要一定的时间执行;浏览器都有反应时间的;

    检测代码执行性能时间:
    var startTime = new Date();
    for (var i=0; i<100000000;i++){
    }
    var endTime = new Date();
    消耗时间 = endTime  -  startTime 返回毫秒结果;

    定时器设定的等待时间,当等待时间到了,也不一定立刻执行函数,我们要看主体内容是否执行完成,当主体任务完成后,才可以去等待区域去执行等待的代码函数(js是单线程的);
    当主任务区域中,遇到死循环,主任务永远不会执行完,所以我们等待区域的代码讲永远不会执行; 
    当主任务完成后,到等待任务中,把到时间的任务执行,如果很多任务都到时间,按照时间执行,谁先到时间先执行谁的任务;

(5)应用定时器实现js动画
第一种动画:不限定运动时间,规定的是步长(每隔多长时间走多远),我们运动元素在现有的位置累加步长来完成动画;
第二种动画:限定动画时间,在规定时间内完成我们动画,

二,边界动画判断:
(1)为了多走一步超过边界,少一步到不了边界,在js中动画中,加上步长来判断,模拟走的这一步超过了边界我们强制赋值到边界;
(2)我们定时器的返回值,不要设置全局作用域,避免全局污染,我们设置到当前元素的自定义属性上;
    var step =10,start,target,ele
   ele.timer = setInterval(function () {
        if (ele.style.left+step >=target) {
            console.log('到达边界');
           clearTimout(ele.timer)
        }
        ele.style.left +=step
    },10)
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消