看看这个tutorial我在一条评论中看到了以下代码建议:
init:function(callback){
var that =this ;
return $http.jsonp(this.url).success(
function(data){
that.availableGenres = that.getGenres(data);
that.results = that.getResults(data);
if(callback)callback.apply(null,[].slice.call(arguments))
}
)
}
但这一行callback.apply(null,[].slice.call(arguments))
对我来说很奇怪。
为什么不只是:callback.apply(null, arguments)
?因为我不喜欢当我不理解我用这个Fiddle来解决某些问题的时候,以了解slice
函数的必要性。但它给了我相同的结果,我仍然没有得到它。
任何人都知道为什么需要slice
?
答案 0 :(得分:28)
你真的不需要它,直接将arguments
传递给apply
就好了。
在EcmaScript 3中指定允许,EcmaScript 5甚至允许任何类似数组的对象,不仅包括数组和参数对象。也许它需要与早期或有缺陷的JS实现向后兼容。另外,(正如你从其他答案中看到的那样),有些人不知道这个事实,并认为他们需要传递实际数组 - 所以他们不必小心。
答案 1 :(得分:2)
需要切片,因为function.apply需要一个数组arguments is not a real array,但可以使用切片转换为一个数组。
arguments对象不是Array。它类似于数组,但是 除了length之外没有任何Array属性。例如,确实如此 没有pop方法。但是它可以转换为真正的数组:
var args = Array.prototype.slice.call(arguments);
这是javascript的丑陋部分之一