BindBuffer: примеры (JAVASCRIPT)

Использование метода bind для управления контекстом в JavaScript
Раздел: WebGL, Буферы
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: Использование в асинхронном коде для сохранения контекста.

Пример javascript
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: Создание специализированных конструкторов с предустановленными аргументами.

Пример javascript
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: Комбинирование привязки контекста и каррирования для создания функций с предопределённым поведением.

Пример javascript
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 раз(а).

JS bindBuffer function comments

En
BindBuffer Binds a given WebGLBuffer to a target