前端八股整理(手写 03)|防抖节流、深拷贝、函数柯里化

文章目录

前端八股整理(手写 03)|防抖节流、深拷贝、函数柯里化

1.防抖节流

防抖

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <input type="text" id="input">
    </div>
</body>

<script>
    // 防抖核心函数 一个副作用函数,一个延迟时间
    function debounce(fn,delay)
    {
        let timer= null;
        return function(...args)
        {
            clearTimeout(timer);
            timer=setTimeout(fn,delay);
        }
    }
    function printfn()
    {
        console.log("已发送");
    }
    const debounceSend=debounce(printfn,2000);
    const input=document.getElementById('input');
    input.addEventListener('input',debounceSend);
</script>
</html>

节流

设置一个标志 canrun,用 setTimeout 定时清除

javascript 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <button id="button">点击</button>
    </div>
</body>

<script>
    // 防抖核心代码
    function throttle(fn,delay)
    {
        let canrun=true;
        return function(...args)
        {
            if(!canrun) return;
            canrun=false;
            fn.apply(this,args);
            setTimeout(()=>{canrun=true},delay)
        }
    }
    function printfn()
    {
        console.log("已发送");
    }
    const throttleSend=throttle(printfn,5000);
    const button=document.getElementById('button');
    button.addEventListener('click',throttleSend);
</script>
</html>

2.深拷贝

javascript 复制代码
const text={
    name:'xiaowang',
    age:18,
    mark:{
        english:100,
        chinese:99
    }
};

// 深拷贝核心函数
function deepclone(obj)
{
    if(typeof obj!=='object'||obj===null) return obj;

    const clone=Array.isArray(obj)?[]:{};

    // 遍历 key
    for(let key in obj)
    {
        clone[key]=deepclone(obj[key]);
    }

    return clone;
}

var deepobj=deepclone(text);
console.log(deepobj);
console.log(deepobj.mark===text.mark);

3.函数柯里化

写法理解

javascript 复制代码
function foo() {
return function(x) {
 console.log(x);
}
}
foo()(3);
相当于:
const fn = foo();
fn(3);

用到了闭包

复制代码
return function (...nextargs) {
return curried(...c, ...nextargs);
};

真正体现闭包的是 curry(add) 执行后返回的内部函数还能记住外层的 fn,以及后续返回的函数还能记住之前的 args。这个内部函数用到了外层函数的变量args

普通函数:

javascript 复制代码
function add(a, b, c) {
  return a + b + c;
}

add(1, 2, 3); // 6

柯里化之后,希望它能这样调:

javascript 复制代码
curriedAdd(1)(2)(3); // 6
curriedAdd(1, 2)(3); // 6
curriedAdd(1)(2, 3); // 6
curriedAdd(1, 2, 3); // 6

本质就是把一次传多个参数,分为多次传参数,最后再执行.

javascript 复制代码
function add(a,b,c)
{
    return a+b+c;
}

function curry(fn)
{
    return function curried(...args)
    {
        if(args.length>=fn.length) return fn(...args);
        else 
        {
            return function(...nextargs)
            {
               return curried(...args,...nextargs);
            }
        }
    }
}

const  addcurry=curry(add);
console.log(addcurry(1,2,3));
console.log(addcurry(1,2)(3));
console.log(addcurry(1)(2)(3));
相关推荐
石小石Orz8 小时前
我发现了开发者AI产品营收的新方向
前端·虚拟现实
老马识途2.08 小时前
关于跨域问题的总结
java·前端
别惊醒渔人10 小时前
Vue3 Diff 优化:最长递增子序列 LIS
前端·javascript·vue.js
颜酱10 小时前
07 | 把字段与指标同步到 Qdrant(生成阶段)
前端·人工智能·后端
用户0595401744610 小时前
把AI长期记忆测试从手动验证换成pytest,2天揪出11个隐藏Bug
前端·css
lichenyang45311 小时前
从 Vite 空项目到 AIGC 图片工作台:我如何打通生图、任务轮询、生成库与 Canvas 动态特效
前端·人工智能
泡沫冰@11 小时前
上章节中文件的讲解
前端·网络·nginx
进击的丸子12 小时前
APP人脸识别增值版Harmony Demo实操与关键代码解析
前端·程序员·harmonyos
a11177612 小时前
唯美花朵风格的黑胶唱片音乐播放器
前端·css·css3
Hilaku12 小时前
工作 5 年后,决定你薪资上限的究竟是什么?
前端·javascript·程序员