V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aikilan
V2EX  ›  程序员

JS 如何复制一个函数?

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


    我瞬间闷逼了,能想到的原型链上下手,但是似乎也不是什么好的解法,面试官提示说你能想到的返回函数的 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
    这是什么神仙公司问出来的问题
    chengyiqun
        25
    chengyiqun  
       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   ·   实用小工具   ·   2901 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:16 · PVG 20:16 · LAX 04:16 · JFK 07:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.