函数适用于使用切片的参数

时间:2013-12-04 11:14:21

标签: javascript arrays function angularjs slice

看看这个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

2 个答案:

答案 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的丑陋部分之一