前端八股整理(手写 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));
相关推荐
IT_陈寒5 分钟前
React useEffect依赖数组把我坑惨了,这次搞明白了
前端·人工智能·后端
gcw10245 分钟前
Cron专业工具:定时任务与开发办公的一站式在线工具箱
java·前端·数据库·工具·crontab·cron·spring cron
环境栈笔记11 分钟前
AI 浏览器任务失败怎么排查:Context、Session、Page State 和 Task Log 检查清单
前端·人工智能·后端·自动化
阳光是sunny11 分钟前
别再让 AI 瞎找代码了!CodeGraph 这工具能让它秒懂你的项目
前端·后端·ai编程
tuddy78946426 分钟前
快速创建常见的数据模型、CRUD 接口、配置文件等重复性结构
前端
小流苏生1 小时前
这是一篇关于忘记的文章
前端·程序员·ai编程
2601_963771371 小时前
Scaling Podcast RSS Feeds and Audio Streaming on WordPress Servers
前端·windows·php
名字还没想好☜3 小时前
Next.js App Router 数据获取:fetch 缓存、revalidate 与 dynamic 一次讲清
前端
成都渲染101云渲染66667 小时前
如何在3ds Max中实现更快、更高质量的渲染
前端·javascript·人工智能
闲猫9 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring