Функция применяется с аргументами с использованием среза
Глядя на это 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