Вернуться к уроку

Кросс-браузерная эмуляция bind

важность: 3

Если вы вдруг захотите копнуть поглубже – аналог bind для IE8- и старых версий других браузеров будет выглядеть следующим образом:

function bind(func, context /*, args*/) {
  var bindArgs = [].slice.call(arguments, 2); // (1)
  function wrapper() {                        // (2)
    var args = [].slice.call(arguments);
    var unshiftArgs = bindArgs.concat(args);  // (3)
    return func.apply(context, unshiftArgs);  // (4)
  }
  return wrapper;
}

Использование – вместо mul.bind(null, 2) вызывать bind(mul, null, 2).

Не факт, что он вам понадобится, но в качестве упражнения попробуйте разобраться, как это работает.

Страшновато выглядит, да? Работает так (по строкам):

  1. Вызов bind сохраняет дополнительные аргументы args (они идут со 2-го номера) в массив bindArgs.
  2. … и возвращает обертку wrapper.
  3. Эта обёртка делает из arguments массив args и затем, используя метод concat, прибавляет их к аргументам bindArgs (карринг).
  4. Затем передаёт вызов func с контекстом и общим массивом аргументов.