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

JS 如何复制一个函数?

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


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

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

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

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

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

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

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