面试的时候面试官问如何复制数组、对象,我巴拉巴拉说,说完突然问我那如何复制一个函数呢?

我瞬间闷逼了,能想到的原型链上下手,但是似乎也不是什么好的解法,面试官提示说你能想到的返回函数的 API 有啥,我就更闷逼了。

迷惑人的一天。

还想起来,问我“H5 做过么?”,我也是一脸闷逼,反问道“您说的 H5 具体指什么?”,面试官笑笑不作答,仿佛我是个傻子。

f.bind(null)

复制不了的。我给你个引用了闭包的函数,你能复制一样的东西吗?

函数也是对象啊,不过他的提示可能就是 bind/call/apply 这种吧

思路:function.toString() 可以拿到函数的字面量,然后用正则解析出参数和函数 body ,调用 new Function() 就可以复制函数了。当然这种方式只能复制一些纯函数,对闭包或者其它有 Side Effect 的函数不灵。

fn_a = function(x,y){return x+y;};
fn_a.toString()

"function(x,y){return x+y;}"

fn_b = (x, y) => x+y;
fn_b.toString()

(x, y)=>x+y;

=> 算不算?

同楼上,bind 、apply 。

我试了一下,好像还真可以: codesandbox.io/s/hungry-mendel-evrnq?file=/src/index.js

但我感觉如果用 bind 不设置 this 的话,好像没有任何实际意义

不是直接赋值给一个变量就行了?复制函数是什么意思?

面试官问的不好

b = a.bind(null) 和 b = a 相比,除了判断相等的结果不一样之外还有别的区别吗

嗯?

为啥那么复杂,很简单的处理下就好了。

/** 原始函数 */
function f1() {
 var n = 999;

 nAdd = function () {
 n += 1;
 };

 function f2() {
 alert(n);
 }

 return f2;
}

/** 复制?? */
function a(x) {
 return x;
}

/** 复制原始函数到 f3 */
var f3 = a(f1);

console.log(f3);

f3();

函数不需要复制啊,一个东西需要区分“复制”和“引用”,是因为这东西可以修改,或者需要管理内存。函数没法修改,内存管理 JS 帮你干了,就不需要复制了。

感觉是想问深拷贝与浅拷贝,js 所有都是对象,能复制的。。

函数的本质就是提高可复用性,降低代码复杂度,你复制函数有什么意义?

为什么面试要问那么奇怪的问题?真实的业务场景里真的会用到吗

我能想到的唯一的用途是对类的成员函数进行 Hook

ctrl+c/ctrl+v (狗头

能问出这种问题,要么是你曲解了面试官的意思,要么面试官是个煞笔

问的太笼统太不严谨了, 你能想到 n 种环境下 n 种解法。

但是面试官只会假定一种环境 ,不给你设定前提,那就是面试官的问题了。

就像问你 css 盒子水平居中有几种方法,但是不给你说是否有父级,父级宽高是不是固定等等假定的条件,你总不可能每种都给他写出来吧

直接编译这个函数, 生成这个函数的 AST (抽象语法树),这个就可以了。 如果要执行这个函数, 直接执行这个 AST 就可以了。

楼上的方法刚试了两都可以,但面试官 “提示说你能想到的返回函数的 API 有啥” 这我也懵,有哪位前端大妞解释下不?

所以 H5 到底指什么 不懂

eval?

这是什么神仙公司问出来的问题

小程序? 混合模式 app? 新型框架的网页? 快应用? 网页游戏?
这些都算 H5

楼上都在说啥呢 Object.assign 就行了

我错了但我没说

啥叫复制函数...场景是啥?

喜欢拿 h5 指代 web 或者移动端 web 的都是老一辈前端 /非专业前端了,找工作嘛,别太锋芒毕露,心里吐槽下就行了。容忍菜鸟同事和领导也是工作的一部分,大家都不容易。