BindBuffer: примеры (JAVASCRIPT)
bindBuffer(target: GLenum, buffer: WebGLBuffer): undefinedОписание функции bind
В JavaScript нет встроенной функции bindBuffer. Возможно, имеется в виду стандартный метод Function.prototype.bind(), который создаёт новую функцию с предопределённым значением this и, опционально, начальными аргументами.
Когда используется: Метод bind() применяется для явной привязки контекста выполнения (this) к функции. Это необходимо, когда нужно гарантировать, что функция будет вызвана в определённом контексте, например, при передаче метода объекта в качестве колбэка или обработчика событий.
Аргументы:
- thisArg (обязательный) - Значение, которое передаётся как параметр this целевой функции при вызове связанной функции.
- arg1, arg2, ..., argN (опциональные) - Аргументы, которые будут предопределены для связанной функции перед теми, которые будут переданы при её вызове.
Возвращаемое значение: Метод возвращает новую функцию (копию исходной), у которой значение this жёстко привязано к переданному thisArg, а начальные аргументы (если они были переданы) предустановлены.
Примеры использования bind
Пример 1: Базовая привязка контекста.
const person = {
name: 'Анна',
greet: function() { console.log(`Привет, ${this.name}!`); }
};
const boundGreet = person.greet.bind(person);
boundGreet(); // Вызываем функцию с привязанным контекстом.Привет, Анна!
Пример 2: Предустановка аргументов (каррирование).
function multiply(a, b) {
return a * b;
}
const double = multiply.bind(null, 2); // Первый аргумент предустановлен как 2.
console.log(double(5)); // Фактически вызывается multiply(2, 5).
console.log(double(10));10 20
Похожие методы в JavaScript
Function.prototype.call() и Function.prototype.apply() также позволяют управлять контекстом выполнения функции.
- call(thisArg, arg1, arg2, ...) – Вызывает функцию немедленно с указанным контекстом this и списком аргументов.
- apply(thisArg, [argsArray]) – Вызывает функцию немедленно с указанным контекстом this и массивом аргументов.
Когда что использовать: Метод bind() используется, когда нужно не вызвать функцию сразу, а создать новую, «заготовку» с фиксированным контекстом и/или аргументами для последующего вызова. Методы call() и apply() вызывают функцию моментально.
Аналоги в других языках
Python (functools.partial): Создаёт новую функцию с частично применёнными аргументами.
from functools import partial
def multiply(a, b):
return a * b
double = partial(multiply, 2)
print(double(5))10
Отличие: partial не управляет контекстом self явно, как bind управляет this. Контекст метода в Python обычно привязывается автоматически.
PHP (Closure::bind, Closure::call): Позволяет привязать объект и область видимости к замыканию.
class Greeter {
private $name = 'Мир';
function greet() { echo "Привет, $this->name!"; }
}
$greeter = new Greeter();
$boundFunction = Closure::bind(function() {
$this->greet();
}, $greeter, $greeter);
$boundFunction();Привет, Мир!
Типичные ошибки
Ошибка 1: Попытка привязать контекст к функции, которая не использует this. Это не вызывает ошибки, но бесполезно.
function sum(a, b) { return a + b; }
const boundSum = sum.bind({x: 10}); // Объект {x:10} станет this, но функция его не использует.
console.log(boundSum(1, 2));3 // Работает, но привязка контекста не имела эффекта.
Ошибка 2: Использование bind на стрелочной функции. У стрелочных функций нет собственного this, он лексически наследуется из окружающего контекста, поэтому bind не сможет его изменить.
const obj = { value: 42 };
const arrowFunc = () => console.log(this.value);
const boundArrow = arrowFunc.bind(obj);
boundArrow(); // this не будет указывать на obj.undefined // (В строгом режиме браузера this будет window/global, у которого нет свойства value).
История изменений
Метод Function.prototype.bind() был стандартизирован в ECMAScript 5 (ES5) и с тех пор его спецификация остаётся стабильной. В более поздних версиях стандарта (ES6/ES2015 и далее) не было внесено значительных изменений в его работу, но он естественным образом стал работать с новыми возможностями языка, такими как классы, параметры по умолчанию и стрелочные функции.
Расширенные примеры
Пример 1: Использование в асинхронном коде для сохранения контекста.
class Logger {
constructor(prefix) { this.prefix = prefix; }
log(message) {
// Без bind this в setTimeout был бы undefined (в строгом режиме).
setTimeout((function() {
console.log(`[${this.prefix}] ${message}`);
}).bind(this), 100);
}
}
const myLog = new Logger('MyApp');
myLog.log('Запуск');[MyApp] Запуск
Пример 2: Создание специализированных конструкторов с предустановленными аргументами.
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
// Создаём специализированный конструктор для конкретной модели.
const CreateToyotaCamry = Car.bind(null, 'Toyota', 'Camry');
const car2023 = new CreateToyotaCamry(2023);
console.log(car2023.make, car2023.model, car2023.year);Toyota Camry 2023
Пример 3: Комбинирование привязки контекста и каррирования для создания функций с предопределённым поведением.
const buttonActions = {
prefix: 'Кнопка',
createAction: function(actionName, count) {
return `${this.prefix}: выполнено действие "${actionName}" ${count} раз(а).`;
}
};
// Создаём функцию, у которой this привязан, а первый аргумент предустановлен.
const createSaveAction = buttonActions.createAction.bind(buttonActions, 'сохранение');
console.log(createSaveAction(1));
console.log(createSaveAction(5));Кнопка: выполнено действие "сохранение" 1 раз(а). Кнопка: выполнено действие "сохранение" 5 раз(а).