封装动画、回调函数、纯函数

71 阅读2分钟

封装动画

    //新的位置=当前位置+步长
    //1、清空上一次的定时器,保证只有1个定时器
    //2、开启一个新的定时器
    //3、获取当前位置
    //4、判断方向,得到步长
    //5、新的位置=当前位置+步长
    //如果剩下的路程不足1步,就要清空定时器
    export const animate=(obj,json,callback)=>{
    clearInterval(obj.timer);
    obj.timer=setInterval(()=>{
        var flag=true;
        for(var attr in json){
            var target=0;
            var current=0;
            //如果是透明度,需要特殊处理
            if(attr=="opacity"){
                target=parseFloat(json[attr])*100;
                current=parseFloat(getStyle(obj,attr))*100;
            }else{
                target=parseInt(json[attr]);
                current=parseInt(getStyle(obj,attr));
            }
            var step=(target-current)/10;
            step=step>0?Math.ceil(step):Math.floor(step);
            if(attr=="opacity"){
                obj.style.opacity=(current+step)/100
            }else{
                obj.style[attr]=current+step+"px";
            }
            if(target!=current){
                flag=false
            }
        }
        if(flag){
            clearInterval(obj.timer)
            //清空定时器(动画总完)
            if(typeof callback=="function"){
                return callback();
            }
        }
       
    },30)
}
    
    Math.floor() 向下取整
    
    Math.ceil()向上取整

回调函数

回调函数也是一种高阶函数,把一个函数当做另外一个函数的参数,在另外一个函数内部被执行和传递参数

好处:

1.解决异步 2.对函数进行功能扩展

缺点:

1.容易造成回调地狱,回调地狱不方便维护与理解, 2.解决方案使用 promise + async + await

    
    //别人的
        function fn(callback){
            var a=10;
            var b=30;
            var res=a+b;

            if(typeof callback=="function"){
                callbck(res);//callback 就是下面fn函数 输入的匿名函数
            }

            return "123"
            //虽然执行return res; 外部能接受到res,但是破坏了原来定义fn的人,想return "123"的本意,我们只能在不破坏别人
            //的本意下,还能使用到res的值,就只能callback(res)传递参数
            //一个函数,只能执行一次return,如果return了 res ,就不能return "123'
        }

        //自己的
        fn(function(ccc){
            console.log(ccc);
        })
        console.log(fn());

纯函数

有参数的输入,有结果输出
并且不会产生副作用(不会对函数以外变量,产生影响)

absolute和fixed的区别

区别很简单:

1、没有滚动条的情况下没有差异

2、在有滚动条的情况下,fixed定位不会随滚动条移动而移动,而absolute则会随滚动条移动