如何拷贝一个函数?

本文探讨了在JavaScript中拷贝函数的问题。尽管函数作为一等公民可以直接调用,但作者提出拷贝函数的可能性。分析了JavaScript中拷贝的概念,区分了值类型和引用类型,并提供了深度拷贝的示例,强调了处理特殊类型对象如Set、Map、Function的挑战。文章以将函数拷贝问题转化为对象拷贝问题为切入点,讨论了JSON.stringify()和JSON.parse()的方法,以及处理原型和对象描述符拷贝的复杂性。
摘要由CSDN通过智能技术生成

背景

在学习js的时候,总有各种“拷贝”的问题存在,之前一直也搞不清楚(虽然现在有不怎么清楚2333),在学习和实践的过程中,突然想到一个问题:如何拷贝一个函数?

然后心中略微一懵,啥?这是个啥?然后网上一搜,大家也都表示这个问题很奇葩,主要的观点为:js中,函数是‘一等公民’,不属于任何谁谁谁,因此不论是在哪里,都可以直接调用函数,因此js根本不需要所谓的‘拷贝’,直接调用就行了。

后来想了一下,确实,函数本身就是一个单独的内存块,它不属于任何对象或函数或xxx,function本身有call、bind这些函数用来绑定this值,实际上他就是一个第三方独立的工具一般存在。

再往深的想一想

但如果说,我们就是想拷贝一个函数呐(虽然很难想到应用场景)?那么这个问题也是可以有分析的思路的。

  • 什么是拷贝?
    拷贝,是复制的意思,也就是单独请求一个内存块来存储特定的信息,且这部分信息是与原来的部分独立开的。

  • js中的拷贝
    js 中的基础类型的值,是值类型的,例如 number、string、null、undefined、boolean。这些类型的特点就是,‘是什么,就是什么,改变了,内存中的值也就发生了改变’。
    而 js 中的对象和函数都是‘引用类型’,当我们直接使用赋值运算给一个变量赋值时,其实只是把对象的地址指针给了该变量,举个例子:

    	let func = function () {
         
    		console.log('this is from func')
    	}
    	let varFunc1 = func
    	let varFunc2 = func
    	varFunc1 = function () {
         
    		console.log('this is from varFunc1')
    	}
    	varFunc1() // => this is from varFunc1
    	varFunc2() // => this is from func
    

    这个例子中,varFunc1和varFunc2的值其实都是一个指向 func 这个函数内存地址的一个指针(姑且先这么理解吧)。如果我们重新对 varFunc1 赋值,发生的事情仅仅是改变了 varFunc1 这个变量的指针而已。而实际 函数本身 ,一直在内存中的某个位置待着,等着其他地方调用。

  • 要怎么拷贝?
    拷贝的意义就是形成两个‘完全一样’ 却又 ‘完全不相关’的东西,因此,拷贝的过程也可以从这里下手。

    • 对于一个json对象的拷贝
      json对象也就意味着每一层对象中,仅存在:基本类型、对象、数组 这三种,那么最简单的方式就是使用JSON对象提供的两个方法:JSON.stringify() 、JSON.parse()
      举个例子:
    let target = {
         
    	a: 123,
    	b: {
          b1: 234, b2: [1, 3, 5]},
    	c: true
    }
    let copy = JSON.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iamlongalong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值