Function apply with arguments using slice

2019-04-04 09:07发布

Looking at this tutorial I saw the following code suggestion in one comment:

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))
                }
            )
        }

But this line callback.apply(null,[].slice.call(arguments)) looks weird to me.

Why not just: callback.apply(null, arguments)? Because I don't like when I don't understand the point of something I played around with this Fiddle to understand the need of slice function in there. But it gives me the same result and I still do not get it.

Anyone knows why slice is needed?

2条回答
狗以群分
2楼-- · 2019-04-04 09:14

You don't really need it, passing arguments to apply directly is fine.

It is specified to be allowed in EcmaScript 3, and EcmaScript 5 even allows any array-like objects not only arrays and arguments objects. Maybe it was needed to be backwards-compatible with even earlier or buggy JS implementations. Also, (as you see from the other answers), some people don't know about this fact and think they would need to pass actual arrays - so they are unnecessary careful.

查看更多
等我变得足够好
3楼-- · 2019-04-04 09:15

slice is needed because function.apply requires an array, arguments is not a real array but can be converted to one using slice.

The arguments object is not an Array. It is similar to an Array, but does not have any Array properties except length. For example, it does not have the pop method. However it can be converted to a real Array:

var args = Array.prototype.slice.call(arguments);

this is one of the ugly parts of javascript

查看更多
登录 后发表回答