猿问

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

我正在浏览 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 有什么好处吗?


手掌心
浏览 96回答 3
3回答

慕森王

值得注意的是,当不是数组/字符串并且没有方法时,使用Array.prototype.slice.call(arr, 0)overarr.slice()不会抛出错误。arrarrslice也许他们想要一个更健壮的实现,因此使用第一种方法。

牧羊人nacy

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

人到中年有点甜

在我看来,Array.prototype.slice.call支持 Array-Like Objects,比如 NodeList 集合。const divs = document.querySelectorAll('div')divs.slice(0)//Uncaught TypeError: divs.slice is not a functionArray.prototype.slice.call(divs, 0)//(222) [div.ng-toast.ng-toast--right.ng-toast--bottom.ng-toast--animate-fade, ……
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答