手写call-apply-bind以及了解柯里化

简介: 手写call-apply-bind以及了解柯里化

柯里化

”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用,


add(1,2,3)
add(1)(2)(3)

其实就利用闭包,将变量都存起来并返回一个函数,最后在执行这个函数


柯里化的作用

参数复用


提前返回


延迟运行


(以上三种作用可以看这篇博客函数柯里化_runner_123的博客-CSDN博客_函数柯里化)


function curry() {
            let allArgs = [...arguments]
                // 返回一个新函数
            function curried() {
                allArgs.push(...arguments)
                return curried
            }
            // 重写toString
            curried.toString = function() {
                return allArgs.reduce((prev, curr) => (prev + curr), 0)
            }
            return curried;
        }
        let add = curry(3);
        /*         let a = add(1)(2)(3)
                console.log(a.toString()); */
        /* let a = add(1, 2)(3, 4)(5, 6)
         console.log(a.toString()); */


这里先写个初步版本的柯里化函数,后面还需改善,需要让toString自动化执行,不需要手动执行,今天折腾了一下午自动执行toString结果都输出函数主体,不知道怎么回事,后面有空再折腾吧(可能得继续理解一下这篇博客 https://juejin.cn/post/6864378349512065038#heading-27  )


myCall

 

// 不能用箭头函数,会绑定到window,箭头函数的this指向它创建时候的环境
        Function.prototype.myCall = function(context, ...args) {
            context = context || window
            const key = Symbol()
            context[key] = this
            let res = context[key](...args)
            delete context[key]
            return res
        }
        function go(a, b) {
            console.log(this.c + a + b);
        }
        let obj = {
            c: 10
        }
        go.myCall(obj, 1, 4)


myApply

Function.prototype.myApply = function(context, args) {
            context = context || window
            let key = Symbol()
            context[key] = this
            let res = context[key](...args)
            delete context[key]
            return res
        }
        function go(a, b) {
            console.log(this.c + a + b);
        }
        let obj = {
            c: 20
        }
        go.myApply(obj, [10, 20])


myBind

Function.prototype.myBind = function(context, ...args) {
            return (...restArgs) => this.call(context, ...args, ...restArgs)
        }
        function go(a, b) {
            console.log(this.c + a + b);
        }
        let obj = {
            c: 10
        }
        let r = go.myBind(obj, 100, 200)
        r()
相关文章
|
负载均衡 网络协议 应用服务中间件
【Nginx】Nginx 功能特性
【1月更文挑战第25天】【Nginx】Nginx 功能特性
|
4月前
|
存储 JSON API
aipy实战:Deepseek-V3、Hunyuan&Qwen分析618平板攻略
Aipy是一款结合LLM与Python的智能工具,用户通过简单指令即可让LLM分析并生成代码,实时解决问题。本次v0.1.28版本新增联网搜索、案例分享等功能,并引入混元和Qwen模型。测评中,三个模型完成“618平板选购攻略”任务表现各异:deepseek-v3界面精美、信息全面但价格有偏差;hunyuan-turbos-latest信息不全但界面简洁;qwen-plus-latest推荐合理但数据失真。总体而言,Aipy在操作友好性和分析界面上显著提升,适合解决实际问题。
|
机器学习/深度学习 人工智能 自然语言处理
AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理(2)
AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理
782 0
|
5月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2ASK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
本文分享了基于FPGA的2ASK+帧同步系统硬件测试版本,包含ILA数据采集、VIO SNR设置及数据源模块。通过调整SNR(如45dB和10dB),实现对调制解调性能的验证。2ASK调制将数字信号转为二进制码,通过载波振幅变化传输;帧同步用于确定帧起始位置,确保数据正确解调。附带操作视频与核心Verilog代码,便于理解和复现。
151 9
WK
|
机器学习/深度学习 算法 数据挖掘
什么是逻辑回归分类器
逻辑回归分类器是一种广泛应用于二分类问题的统计方法,它基于线性组合并通过Sigmoid函数将输出映射为概率值进行分类。核心原理包括:线性组合假设函数、Sigmoid函数转换及基于概率阈值的预测。该模型计算高效、解释性强且鲁棒性好,适用于信用评估、医疗诊断、舆情分析和电商推荐等多种场景。利用现有机器学习库如scikit-learn可简化其实现过程。
WK
218 1
|
11月前
|
移动开发 前端开发 JavaScript
xss模糊测试
xss模糊测试
|
机器学习/深度学习 自然语言处理 PyTorch
pytorch实战---IMDB情感分析
pytorch实战---IMDB情感分析
pytorch实战---IMDB情感分析
|
Kubernetes Java 网络安全
GitLab CI构建SpringBoot-2.3应用
SpringBoot应用提交到GitLab后,会自动构建成docker镜像,甚至自动部署在K8S环境
301 0
GitLab CI构建SpringBoot-2.3应用
|
Java Maven 数据安全/隐私保护
Java 给 Word 文档每一页添加不同图片水印
Java 给 Word 文档每一页添加不同图片水印
476 0
|
开发框架 JSON Kubernetes
.NET Core - 环境变量配置和文件提供程序配置方式详解
.NET Core - 环境变量配置和文件提供程序配置方式详解