为了账号安全,请及时绑定邮箱和手机立即绑定

什么时候使用 call 或者在 Javscript 中使用 call 有什么好处?

什么时候使用 call 或者在 Javscript 中使用 call 有什么好处?

手掌心 2022-12-09 13:44:32
我正在浏览 Ramda.JS 的源代码,它是一个面向 Javascript 开发人员的功能库。这几行代码让我有点困惑。var sort = _curry2(function sort(comparator, list) {  return Array.prototype.slice.call(list, 0).sort(comparator);});我的问题是Array.prototype.slice.call(list, 0)应该与 完全相同list.slice(0),但第二种方式要短得多为什么用.call这里,为什么不用第二种方式呢?在这里使用 call 有什么好处吗?
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

值得注意的是,当不是数组/字符串并且没有方法时,使用Array.prototype.slice.call(arr, 0)overarr.slice()不会抛出错误。arrarrslice

也许他们想要一个更健壮的实现,因此使用第一种方法。


查看完整回答
反对 回复 2022-12-09
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

从签名我可以说 list.slice()[0] 与 Array.prototype.slice.call(list, 0) 完全不同,在前面的语句中你首先调用 list.slice 并访问它的第 0 个索引元素,在后面您正在调用 Array.slice 的语句将上下文作为列表的值传递,将 0 作为参数传递给切片函数。



查看完整回答
反对 回复 2022-12-09
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

在我看来,Array.prototype.slice.call支持 Array-Like Objects,比如 NodeList 集合。


const divs = document.querySelectorAll('div')

divs.slice(0)

//Uncaught TypeError: divs.slice is not a function

Array.prototype.slice.call(divs, 0)

//(222) [div.ng-toast.ng-toast--right.ng-toast--bottom.ng-toast--animate-fade, ……


查看完整回答
反对 回复 2022-12-09
  • 3 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信