Прокомментируйте работу функции bind()

110
15 сентября 2019, 02:20

function bind(f, context){ 
	return function (){ 
		return f.apply(context, arguments) 
	}; 
} 
 
function f(a){ 
 console.log(this); 
console.log(a); 
} 
 
var a = bind(f, 'ada', 'fak'); 
 
console.log(a())

1) Функция bind() получает аргументы f(функция) и context;
2) Внутри bind() есть анонимная функция, где первый аргумент получает метод apply и становится его context, а 2 аргумент выводится в console.log(); правильно ?

Answer 1
  • Функция bind вызывается с тремя аргументами: f, 'ada' и 'fak'. Переменная a ждёт возвращаемый функцией результат.

var a = bind(f, 'ada', 'fak');

  • Однако обработчик функции имеет только 2 параметра: f(сюда после вызова попадает функция) и context(сюда строка 'ada'), третий аргумент (строка 'fak') упускается.

function bind(f, context)

  • Функция bind сразу же возвращает другую анонимную функцию, которая в свою очередь возвращает результат вызова параметра f. Однако вызов здесь не простой, а методом apply, первый параметр которого в итоге станет контекстным объектом this внутри вызываемой функции, а второй параметр - массив с аргументами для вызываемой функции. В данном случае вторым параметром передаётся псевдомассив arguments, который по умолчанию есть в каждой НЕ стрелочной функции и содержит в себе, соответственно, все переданные в функцию аргументы в виде массива. В нашем случае он будет пуст, так как переменная a, содержащая в себе эту анонимную функцию, в конце концов будет вызвана без аргументов (console.log(a()))

return function (){ return f.apply(context, arguments) };

  • Ну и сама функция f имеет 1 параметр a, который в нашем случае будет undefined, так как массив аргументов, при вызове через метод apply, был пуст.

function f(a)

  • console.log(this); возвращает такой объект, так как в метод apply первым аргументом мы передали строку 'ada', которая затем неявно преобразовалась в объект.
Answer 2
function bind(fnToCall, objectThis, args){
    return function (){
        return fnToCall.apply(objectThis, args)
    };
}
function f(a){
   console.log(this);
   console.log(a);
}
var a = bind(f, {
    text: "Hello"
}, ["Another argument"]);
a()

В функцию bind вы передаете функцию f, которая вызвается так, что this внутри функции f равен objectThis. Третьим аргументом является массив, который передает аргументы функции f. Попробуйте использовать разные значение аргументов, которые вы передаете в функцию bind, чтобы хорошо разобраться.

READ ALSO
Как у функции javascript может быть свой метод, как у объекта?

Как у функции javascript может быть свой метод, как у объекта?

Я недавно наткнулся на данный код и не могу понять, как это работаетПодскажите, пожалуйста

102
JavaScript V8 создание и использование скрытых классов

JavaScript V8 создание и использование скрытых классов

Всем привет! Возник вопрос по поводу работы V8Вот предположим мы создали объект какой-то и для него создалась цепочка скрытых классов

96
Ajax Загрузка Пагинация

Ajax Загрузка Пагинация

Есть Код на Jquery

78
Скрипт читает только одну форму на сайте

Скрипт читает только одну форму на сайте

Сегодня хотел бы обратится к тем, кто знает что делать со скриптом или формой, чтобы при использовании скрипта читалась не только первая формаВкратце:...

113