Функция применяется с аргументами с использованием среза

Глядя на это 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?

Ответы

Ответ 1

Вам это действительно не нужно, передавая arguments в apply прямо.

Указывается, что разрешено в EcmaScript 3 и EcmaScript 5 даже позволяет любым подобным массиву объектам не только массивы и объекты аргументов. Возможно, это было необходимо для обратной совместимости с еще более ранними или ошибочными реализациями JS. Кроме того, как вы видите из других ответов, некоторые люди не знают об этом факте и думают, что им нужно будет передавать фактические массивы, поэтому они не нужны осторожны.

Ответ 2

требуется срез, потому что function.apply требует массив, аргументы не являются реальным массивом, но могут быть преобразованы в один, используя срез.

Объект arguments не является массивом. Он похож на массив, но не имеет свойств Array, кроме длины. Например, это не имеет метода pop. Однако он может быть преобразован в реальный массив:

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

это одна из уродливых частей javascript