Здравствуйте!
На MDN при описании встроенной в язык функции bind() приводится следующий пример :
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
// . . .
slice(arguments);
Я понимаю что это сокращение конструкции
let args = Array.prototype.slice.call(arguments)
НО вот хоть убей не понятен момент с
bind()
, если следовать логике устройства
bind()
это вспомогательная утилита выглядит примерно так . . .
Function.prototype.bind = function(contextObject){
let funkToBind = this,
args = Array.prototype.slice.call(arguments,1)
return funkToBind.apply( contextObject , args.concat(Array.prototype.slice.call( arguments )))
} // упращение, сущности данной функции
Тоесть метод
bind()
возвращает новую функцию, которая через замыкание на внешнюю функцию получает контекст, в котором и будет вызываться, т.е.
let b = [1,2];
function ass(){
return this;
};
console.log((ass.bind(b))()) // [1, 2]
Здесь всё понятно, но я не понимаю случая, когда в
call.bind()
передаётся
функция в качестве контекста (т.е. то, на что будет указывать
this
при вызове
call()
) :
slice = Function.prototype.call.bind(Array.prototype.slice);
function m(){
console.log(
slice(arguments).sort(
(m,a)=>m-a
)
);
};
m(5,3,2,4,1); // [1, 2, 3, 4, 5]
Получается что в данном случа наш вызов утрированно можно переписать следующим образом?
. . .call.bind(Array.prototype.slice){
return call.apply(Array.prototype.slice)
};
И получается что
call()
будет вызываться в контексте функции (ну разумеется объекта функции
slice()
, т.к. в
js
функции тоже являются объектами)? Хм, ну то, что в результате происходит мне понятно, но вот как работает вызов
call()
когда контекстом ему передаётся функция мне не очень понятно , т.е.
this
при вызове
call()
в примере выше будет указывать на
[].prototype.slice
, в общем быть может кто-нибудь объяснит где мои размышления пошли нетуда, или быть может моё понимание, или я просто что-то путаю, НО я вижу в этой ситуации (сейчас программистам будет сложно, внимание АБСТРАЦИЯ) два пункта, пункт А, в котором два дома, и три жителя (я их всех знаю, и знаю что у них в домах) и вижу пункт Б , который был создан этими тремя жителями из пунтка А, там тоже всё просто, два дома, НО я не пойму как жители пункта А создали это, как они сумели сделать это, и в какой последовательности. . . Извиняюсь за объем текста не нравится не читайте, если видите вопросы больше 6 строк. Пишу так подробно чтобы избежать как минимум 2-ух ответов, и 60ти комментов в духе "чувак,
call()
вызывает функцию в контексте какого-то объекта, или
bind()
возвращает новую функцию, или
[].prototype.slice
нужно чтобы создать новый массив из
arguments
) и прочая трата времени, плавали , знаем! И если
Вы решили написать ответ, попрошу обратить внимание на то, что
Я ПОНИМАЮ /
НЕ ПОНИМАЮ в этой ситуации , т.к. я довольно подробно постарался описать видение проблемы со своей стороны ! Спасибо за понимание и терпение !