Объекты функций могут поставляться вместе с методом bind(), который принимает объект получатель и создает функцию оболочку, вызывающую исходную функцию в качестве метода получателя.
Представим себе объект строкового буфера, хронящий строки в массиве.
var buffer = { entries: [], add: function(s){ this.entries.push(s); } } var source = ["375", "-", "123456"]; source.forEach(buffer.add.bind(buffer)); console.log(buffer.entries);
Причем, buffer.add.bind(buffer) не преобразовывает функцию buffer.add, а создает новую. Парметр buffer является объектом-получателем с сылкой на this.
Лаконичный пример использования bind:
function f() { alert(this.name); } var user = { name: "Вася" }; var f2 = f.bind(user); f2(); // выполнит f с this.name = “Вася”
Задача. Имеется функция, ссылающаяся на this, и производит с ссылкой на this простые арифметические действия. И объект с числом (числами). Необходимо вызвать функцию методом данного объекта.
function x(y) { return this.x + y } var o = {x:1}; var g = x.bind(o); g(2);
Как видно из листинга, метод bind() полезен для связывания методов с получателями.
Однако существует еще один не менее полезный трюк использования bind().
Использование метода bind() для каррирования функций. Методика связывания функций с подмножеством ее аргументов известна как каррирование. Если часть атрибутов функции постоянные для каждой итерации, то это верная причина использования каррирования.
function simpleURL(protocol, domain, path){ return protocol + "://" + domain + "/" + path; } var paths = ["about", "12"]; var url = paths.map(simpleURL.bind(null, "http", "obmenka.by")); console.log(url)
Первый параметр метода bind() предоставляет значение получателя. Поскольку в simpleURL нет ссылки на this, используем null.