V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
kuanng
V2EX  ›  JavaScript

apply.bind 和 call.bind

  •  
  •   kuanng · 2019-06-15 00:03:37 +08:00 · 3310 次点击
    这是一个创建于 1749 天前的主题,其中的信息可能已经有所发展或是发生改变。

    无意中看到一道题:找到每个子数组中的最大值生成一个新的数组

    let arr = [
      [55, 10, 91],
      [32, 43, 50],
      [22, 11, 82],
    ]
    
    let res = foo(arr) // res === [91, 50, 82]
    

    这道题很简单有多种的写法,下面这种比较奇葩

    function foo(arr) {
      return arr.map(Function.prototype.apply.bind(Math.max, null))
    }
    

    思考一下:1、这里的 null 的作用 2、可不可以用 call

    11 条回复    2019-06-15 16:56:16 +08:00
    xxx749
        1
    xxx749  
       2019-06-15 01:55:28 +08:00 via Android
    1、apply 函数的首参数,指定函数运行时使用的 this 值。
    2、不可以
    azh7138m
        2
    azh7138m  
       2019-06-15 02:10:03 +08:00
    function foo(arr) {
    return arr.map(i => Math.max.call(null, ...i))
    }

    用 apply 第一个参数是 this 第二个是实际传给被调函数的参数,null 是把 this 那个位置占掉,这样 map 回调函数的时候,传进来的参数会被传递给 max,call 得用解构的语法。
    Sparetire
        3
    Sparetire  
       2019-06-15 03:12:32 +08:00 via Android
    null 是给 apply 的,前面 Function.prototype 没啥意义,要希望字符少你还可以把它替换成 Map.apply.bind。。
    不过现在有...了这样写也不能省字符,除非你有某些强迫症
    dartabe
        4
    dartabe  
       2019-06-15 06:18:04 +08:00
    求问下为什么不直接写个函数呢? 就多几个字符但是可读性好很多啊
    autoxbc
        5
    autoxbc  
       2019-06-15 06:51:26 +08:00 via iPhone
    说实话这些都是 js 旧时代的糟粕,新提案双冒号符才是回归本质
    dartabe
        6
    dartabe  
       2019-06-15 07:06:48 +08:00
    懂了 现在都用...了
    aleen42
        7
    aleen42  
       2019-06-15 09:13:17 +08:00 via Android
    誰會寫出這種 readable 這麼低的代碼
    xxx749
        8
    xxx749  
       2019-06-15 12:23:34 +08:00 via Android
    @dartabe 减少一层函数嵌套的开销
    FrankFang128
        9
    FrankFang128  
       2019-06-15 12:26:12 +08:00
    蹩脚的 JS,用 ... 就好了
    SoloCompany
        10
    SoloCompany  
       2019-06-15 15:51:19 +08:00
    const foo = arr => _.map(arr, 2)
    palmers
        11
    palmers  
       2019-06-15 16:56:16 +08:00
    return arr.map(item => Math.max(...item)); 我觉得更好一点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1018 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:44 · PVG 03:44 · LAX 12:44 · JFK 15:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.