技术解析

apply.bind 和 call.bind
0
2021-08-30 23:13:55
idczone

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

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


1、apply 函数的首参数,指定函数运行时使用的 this 值。
2、不可以

function foo(arr) {
return arr.map(i => Math.max.call(null, ...i))
}
用 apply 第一个参数是 this 第二个是实际传给被调函数的参数,null 是把 this 那个位置占掉,这样 map 回调函数的时候,传进来的参数会被传递给 max,call 得用解构的语法。

null 是给 apply 的,前面 Function.prototype 没啥意义,要希望字符少你还可以把它替换成 Map.apply.bind。。
不过现在有...了这样写也不能省字符,除非你有某些强迫症

求问下为什么不直接写个函数呢? 就多几个字符但是可读性好很多啊

说实话这些都是 js 旧时代的糟粕,新提案双冒号符才是回归本质

懂了 现在都用...了

誰會寫出這種 readable 這麼低的代碼

减少一层函数嵌套的开销

蹩脚的 JS,用 ... 就好了

const foo = arr => _.map(arr, 2)

return arr.map(item => Math.max(...item)); 我觉得更好一点

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服