• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aikilan
V2EX  ›  程序员

JS 如何复制一个函数?

  •  
  •   aikilan · Dec 8, 2021 · 3959 views
    This topic created in 1791 days ago, the information mentioned may be changed or developed.
    面试的时候面试官问如何复制数组、对象,我巴拉巴拉说,说完突然问我那如何复制一个函数呢?


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

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

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

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

    能问出这种问题,要么是你曲解了面试官的意思,要么面试官是个煞笔
    rebel28
    rebel28
    Dec 8, 2021
    19
    问的太笼统太不严谨了, 你能想到 n 种环境下 n 种解法。

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

    就像问你 css 盒子水平居中有几种方法,但是不给你说是否有父级,父级宽高是不是固定等等假定的条件,你总不可能每种都给他写出来吧
    jones2000
    jones2000
    Dec 8, 2021
    20
    直接编译这个函数, 生成这个函数的 AST (抽象语法树),这个就可以了。 如果要执行这个函数, 直接执行这个 AST 就可以了。
    IT1024
    IT1024
    Dec 8, 2021
    21
    楼上的方法刚试了两都可以,但面试官 “提示说你能想到的返回函数的 API 有啥” 这我也懵,有哪位前端大妞解释下不?
    tousfun
    tousfun
    Dec 8, 2021 via iPhone
    22
    所以 H5 到底指什么 不懂
    llb123
    llb123
    Dec 8, 2021
    23
    eval?
    serge001
    serge001
    Dec 8, 2021
    24
    这是什么神仙公司问出来的问题
    C02TobNClov1Dz56
    C02TobNClov1Dz56
    Dec 8, 2021
    25
    @919615766 小程序? 混合模式 app? 新型框架的网页? 快应用? 网页游戏?
    这些都算 H5
    Austaras
    Austaras
    Dec 8, 2021
    26
    楼上都在说啥呢 Object.assign 就行了
    Austaras
    Austaras
    Dec 8, 2021
    27
    @Austaras 我错了但我没说
    Jooooooooo
    Jooooooooo
    Dec 8, 2021
    28
    啥叫复制函数...场景是啥?
    yaphets666
    yaphets666
    Dec 8, 2021
    29
    喜欢拿 h5 指代 web 或者移动端 web 的都是老一辈前端 /非专业前端了,找工作嘛,别太锋芒毕露,心里吐槽下就行了。容忍菜鸟同事和领导也是工作的一部分,大家都不容易。
    ysc3839
    ysc3839
    Dec 9, 2021 via Android
    30
    @919615766 H5 是国内独有的称呼,一般用来指代 Web 相关技术,具体含义得看语境,来源估计是 HTML5 ,觉得太长了然后缩写 H5 ,至于为啥用 HTML5 来指代 Web ,我是一直没搞懂。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5314 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 104ms · UTC 03:00 · PVG 11:00 · LAX 19:00 · JFK 22:00
    ♥ Do have faith in what you're doing.