Function apply with arguments using slice

倾然丶 夕夏残阳落幕 提交于 2019-12-09 14:52:29

问题


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?


回答1:


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.




回答2:


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



来源:https://stackoverflow.com/questions/20373819/function-apply-with-arguments-using-slice

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!