JS 如何复制一个函数?
面试的时候面试官问如何复制数组、对象,我巴拉巴拉说,说完突然问我那如何复制一个函数呢?
我瞬间闷逼了,能想到的原型链上下手,但是似乎也不是什么好的解法,面试官提示说你能想到的返回函数的 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 的都是老一辈前端 /非专业前端了,找工作嘛,别太锋芒毕露,心里吐槽下就行了。容忍菜鸟同事和领导也是工作的一部分,大家都不容易。
想要自己做一个完整的系统,包含鉴权这方面的,去用 springboot 整合 oauth2.0 的时候,网上一查都是朝来抄去的代码,目前没有找到体系完整的一个项目。 在这过程中…
你是否相信如果你的程序里没有检查一个变量会导致怎么系统瘫痪?无论你相不相信,这是我一个亲身经历过的案例,你可以在本站的程序员那些悲催的事儿中找到很多这样的事。这样的事昨天在发生…
事情是这样的, 去年因为感兴趣一直在学 solana, 也业余时间陆陆续续写了一些 solana 相关的工具和教程. 后来朋友提了一嘴, "说不定能找 solana 基金会要到…