什么时候使用 call 或者在 Javascript 中使用 call 有什么好处?
When to use call or what is the benefit to use call in Javscript?
我正在查看 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 有什么好处吗?
参考资料
更新
非常感谢@VLAZ。
此屏幕截图来自他在 his/her 评论中的建议。
a.slice(0)
和 Array.prototype.slice.call(a, 0)
在非数组对象上非常不同。
值得注意的是,当 arr
不是 array/string 而 arr
不是时,在 arr.slice()
上使用 Array.prototype.slice.call(arr, 0)
不会引发错误'没有 slice
方法。
也许他们想要更健壮的实现,因此使用第一种方法。
从签名我可以说 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 function
Array.prototype.slice.call(divs, 0)
//(222) [div.ng-toast.ng-toast--right.ng-toast--bottom.ng-toast--animate-fade, ……
我正在查看 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 有什么好处吗?
参考资料
更新
非常感谢@VLAZ。
此屏幕截图来自他在 his/her 评论中的建议。
a.slice(0)
和 Array.prototype.slice.call(a, 0)
在非数组对象上非常不同。
值得注意的是,当 arr
不是 array/string 而 arr
不是时,在 arr.slice()
上使用 Array.prototype.slice.call(arr, 0)
不会引发错误'没有 slice
方法。
也许他们想要更健壮的实现,因此使用第一种方法。
从签名我可以说 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 function
Array.prototype.slice.call(divs, 0)
//(222) [div.ng-toast.ng-toast--right.ng-toast--bottom.ng-toast--animate-fade, ……