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

apply.bind 和 call.bind

  •  
  •   kuanng · 37 天前 · 1212 次点击
    这是一个创建于 37 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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
        1
    xxx749   37 天前 via Android
    1、apply 函数的首参数,指定函数运行时使用的 this 值。
    2、不可以
        2
    azh7138m   37 天前
    function foo(arr) {
    return arr.map(i => Math.max.call(null, ...i))
    }

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