Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
only. А то приходилось пару раз писать полную функцию для передачи в map. Я бы, правда, туда ещё контекст вторым аргументом добавил бы.this Function.prototype.only = function(numberOfArgs) {
var self = this; // первый this
return function() {
return self.apply(
this, // второй this
[].slice.call(arguments,0,numberOfArgs)
);
}
}
parseInt.only(1), то первый this равен ссылке на функцию parseInt, а второй зависит от того, как вызовут результат (и скорее всего это будет null, то есть ссылка на window)parseInt.only.apply(ctx, [1])(обратите внимание, что второй аргумент должен быть массивом), то получится так, что первый this — это ctx, а второй — не изменится. А нам надо поменять именно второй для случая, когда мы вызываем метод объекта:array.map(object.method.only(1, object));
// а only переписать так:
Function.prototype.only = function(numberOfArgs, ctx) {
var self = this; // первый this
return function() {
return self.apply(
ctx || this, // второй this
[].slice.call(arguments,0,numberOfArgs)
);
}
}
["1","2","3"].map(Number)array.map(function(value) {
return someCallback(value);
});
only в данном случае — вполне интересна:array.map(someCallback.only(1));
Менять из за людей которые не разбираются и не хотят разбираться в том языке на котором пишут что то в языке — как то нелогично.
.bind, а ведь тоже кто-то мог сказать «менять что-то в языке — как-то нелогично».Но считать из-за этого JS плохим языком? Увольте.
Но это не значит, что Javascript — плохой язык.
["1", "2", "3"].map(parseInt) не работает так, как, казалось бы, должен на первый взгляд.return self.apply(this,[].slice.call(arguments,0,numberOfArgs))['01', '08', '09'].map(parseInt.partial(_, 10)) // [1, 8, 9]["1", "2", "3"].map(parseInt) работает не так как кому-то ожидалось. А ["1", "2", "3"]["0", "1", "2"] работает ещё более непредсказуемо. И что? Если вы пользуетесь методом не зная как он работает, то это не проблема языка — это ваша проблема.Function.prototype.partArgs = function(index)
{
var self = this;
return function __partArgs()
{
var args = [];
for(var i = 0, ii = index.length, ix = index; i < ii; ++i)
args[i] = arguments[ix[i]];
return self.apply(this, args);
};
};
Опасности необязательных аргументов в JavaScript