apply.bind 和 call.bind

2019-06-15 00:03:37 +08:00
 kuanng

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

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

3329 次点击
所在节点    JavaScript
11 条回复
xxx749
2019-06-15 01:55:28 +08:00
1、apply 函数的首参数,指定函数运行时使用的 this 值。
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
2019-06-15 03:12:32 +08:00
null 是给 apply 的,前面 Function.prototype 没啥意义,要希望字符少你还可以把它替换成 Map.apply.bind。。
不过现在有...了这样写也不能省字符,除非你有某些强迫症
dartabe
2019-06-15 06:18:04 +08:00
求问下为什么不直接写个函数呢? 就多几个字符但是可读性好很多啊
autoxbc
2019-06-15 06:51:26 +08:00
说实话这些都是 js 旧时代的糟粕,新提案双冒号符才是回归本质
dartabe
2019-06-15 07:06:48 +08:00
懂了 现在都用...了
aleen42
2019-06-15 09:13:17 +08:00
誰會寫出這種 readable 這麼低的代碼
xxx749
2019-06-15 12:23:34 +08:00
@dartabe 减少一层函数嵌套的开销
FrankFang128
2019-06-15 12:26:12 +08:00
蹩脚的 JS,用 ... 就好了
SoloCompany
2019-06-15 15:51:19 +08:00
const foo = arr => _.map(arr, 2)
palmers
2019-06-15 16:56:16 +08:00
return arr.map(item => Math.max(...item)); 我觉得更好一点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/574110

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX