js 如何深拷贝一个函数?

2020-02-22 11:37:18 +08:00
 px920906

前几天一个面试中的问题,听到有点懵逼,因为从没听说过这种需求,这几天搜索了一通好像也没有明确的方案,自己能想到的是用 bind ? v 友有点子吗?

11799 次点击
所在节点    JavaScript
33 条回复
tlday
2020-02-22 14:39:19 +08:00
忽略代码最后两行,测试 js 时顺手写的
hyy1995
2020-02-22 15:59:10 +08:00
面试玩的是真的花啊
lipeiwei
2020-02-22 16:13:52 +08:00
吃个瓜,我觉得应该是听错了,应该是应该让你写深拷贝而已
lizz666
2020-02-22 16:15:43 +08:00
曾经也有过这样的疑惑,倒是在网上看到过以下这种改变 this 的方式,可能面试官认为这样就算深拷贝函数了吧

```js
function test1() {}
test1.a = 1
let test2 = test1.bind(null)
test2.a // undefined
```
tonytonychopper
2020-02-22 17:35:42 +08:00
不了解,但是可以看下 lodash 是怎么实现的
7DLNU56W
2020-02-22 18:11:40 +08:00
利用 Function.prototype.bind 是不是可以实现呀~
tinyhill
2020-02-22 18:18:36 +08:00
应该是问深拷贝时的函数问题吧,比如 JSON.stringify/parse 会 gg
zhw2590582
2020-02-22 20:16:52 +08:00
要么考查 bind 构造一个新函数,要么考查从现有函数体提取字符串再构造一个新函数
mostkia
2020-02-23 09:22:23 +08:00
把函数当作字符串来处理不知道是不是可以,funciton 不带括号是不执行的,反而会打印出内容,利用 toString()方法接住打印出来的函转为字符串,然后就可以输出了,要转为 fun,外面包一个 eval 执行。
```
function uu(){
alert('???');
}
var echo = uu.toString();

console.log(echo);
eval(echo);
```
tairan2006
2020-02-23 20:59:49 +08:00
深拷贝一个函数?把代码复制一遍…
revalue
2020-07-23 21:43:50 +08:00
@iMusic 为啥一个 eval 一个用的 new Function 呢?不能统一吗?
cj97
2021-01-22 09:50:37 +08:00
浅复制,深复制同理
```
const fn = () => 1;
fn.a = 2;
fn.f = () => 3;
const obj = Object.assign({}, fn);
const cloneFn = fn.bind();
Object.keys(obj).forEach(key => { cloneFn[key] = obj[key] })
```
Tsuizen
2023-04-18 20:53:32 +08:00
new Function('return ' + fn.toString())();

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646565

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX