JS 如何复制一个函数? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 I 生成的内容
aikilan
V2EX    程序员

JS 如何复制一个函数?

  •  
  •  
    aikilan 2021-12-08 12:52:02 +08:00 3161 次点击
    这是一个创建于 1493 天前的主题,其中的信息可能已经有所发展或是发生改变。
    面试的时候面试官问如何复制数组、对象,我巴拉巴拉说,说完突然问我那如何复制一个函数呢?


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

    迷惑人的一天。
    第 1 条附言    2021-12-08 14:33:42 +08:00
    还想起来,问我“H5 做过么?”,我也是一脸闷逼,反问道“您说的 H5 具体指什么?”,面试官笑笑不作答,仿佛我是个傻子。
    amber0317
        1
    amber0317  
       2021-12-08 13:08:17 +08:00 via Android
    f.bind(null)
    noe132
        2
    noe132  
       2021-12-08 13:17:41 +08:00 via Android
    复制不了的。我给你个引用了闭包的函数,你能复制一样的东西吗?
    DrakeXiang
        3
    DrakeXiang  
       2021-12-08 13:25:36 +08:00
    函数也是对象啊,不过他的提示可能就是 bind/call/apply 这种吧
    Mutoo
        4
    Mutoo  
       2021-12-08 13:27:36 +08:00
    思路: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;
    robinlovemaggie
        5
    robinlovemaggie  
       2021-12-08 13:28:50 +08:00
    => 算不算?
    maichael
        6
    maichael  
       2021-12-08 13:29:22 +08:00
    同楼上,bind 、apply 。
    vision1900
        7
    vision1900  
       2021-12-08 13:45:23 +08:00
    vision1900
        8
    vision1900  
       2021-12-08 13:50:03 +08:00
    @vision1900 但我感觉如果用 bind 不设置 this 的话,好像没有任何实际意义
    waiaan
        9
    waiaan  
       2021-12-08 14:05:48 +08:00
    不是直接赋值给一个变量就行了?复制函数是什么意思?
    bzw875
        10
    bzw875  
       2021-12-08 14:09:27 +08:00 via iPhone
    面试官问的不好
    misdake
        11
    misdake  
       2021-12-08 14:11:58 +08:00
    b = a.bind(null) 和 b = a 相比,除了判断相等的结果不一样之外还有别的区别吗
    vanton
        12
    vanton  
       2021-12-08 14:13:26 +08:00
    嗯?

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

    ```
    /** 原始函数 */
    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();

    ```
    secondwtq
        13
    secondwtq  
       2021-12-08 14:13:37 +08:00
    函数不需要复制啊,一个东西需要区分“复制”和“引用”,是因为这东西可以修改,或者需要管理内存。函数没法修改,内存管理 JS 帮你干了,就不需要复制了。
    jtwor
        14
    jtwor  
       2021-12-08 14:14:42 +08:00
    感觉是想问深拷贝与浅拷贝,js 所有都是对象,能复制的。。
    Kasumi20
        15
    Kasumi20  
       2021-12-08 14:15:03 +08:00
    函数的本质就是提高可复用性,降低代码复杂度,你复制函数有什么意义?
    Geo200
        16
    Geo200  
       2021-12-08 14:16:15 +08:00
    为什么面试要问那么奇怪的问题?真实的业务场景里真的会用到吗
    Kasumi20
        17
    Kasumi20  
       2021-12-08 14:17:13 +08:00
    我能想到的唯一的用途是对类的成员函数进行 Hook
    GuuJiang
        18
    GuuJiang  
       2021-12-08 14:17:36 +08:00
    ctrl+c/ctrl+v (狗头

    能问出这种问题,要么是你曲解了面试官的意思,要么面试官是个煞笔
    violetlai
        19
    violetlai  
       2021-12-08 14:18:18 +08:00
    问的太笼统太不严谨了, 你能想到 n 种环境下 n 种解法。

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

    就像问你 css 盒子水平居中有几种方法,但是不给你说是否有父级,父级宽高是不是固定等等假定的条件,你总不可能每种都给他写出来吧
    jones2000
        20
    jones2000  
       2021-12-08 14:31:14 +08:00
    直接编译这个函数, 生成这个函数的 AST (抽象语法树),这个就可以了。 如果要执行这个函数, 直接执行这个 AST 就可以了。
    IT1024
        21
    IT1024  
       2021-12-08 14:51:09 +08:00
    楼上的方法刚试了两都可以,但面试官 “提示说你能想到的返回函数的 API 有啥” 这我也懵,有哪位前端大妞解释下不?
    tousfun
        22
    tousfun  
       2021-12-08 15:02:51 +08:00 via iPhone
    所以 H5 到底指什么 不懂
    llb123
        23
    llb123  
       2021-12-08 15:56:56 +08:00
    eval?
    serge001
        24
    serge001  
       2021-12-08 16:29:22 +08:00
    这是什么神仙公司问出来的问题
    C02TobNClov1Dz56
        25
    C02TobNClov1Dz56  
       2021-12-08 16:54:09 +08:00
    @919615766 小程序? 混合模式 app? 新型框架的网页? 快应用? 网页游戏?
    这些都算 H5
    Austaras
        26
    Austaras  
       2021-12-08 17:01:40 +08:00
    楼上都在说啥呢 Object.assign 就行了
    Austaras
        27
    Austaras  
       2021-12-08 17:08:57 +08:00
    @Austaras 我错了但我没说
    Jooooooooo
        28
    Jooooooooo  
       2021-12-08 18:58:37 +08:00
    啥叫复制函数...场景是啥?
    yaphets666
        29
    yaphets666  
       2021-12-08 22:52:05 +08:00
    喜欢拿 h5 指代 web 或者移动端 web 的都是老一辈前端 /非专业前端了,找工作嘛,别太锋芒毕露,心里吐槽下就行了。容忍菜鸟同事和领导也是工作的一部分,大家都不容易。
    ysc3839
        30
    ysc3839  
       2021-12-09 06:17:03 +08:00 via Android
    @919615766 H5 是国内独有的称呼,一般用来指代 Web 相关技术,具体含义得看语境,来源估计是 HTML5 ,觉得太长了然后缩写 H5 ,至于为啥用 HTML5 来指代 Web ,我是一直没搞懂。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2790 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 03:49 PVG 11:49 LAX 19:49 JFK 22:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86