Кросс-браузерная эмуляция 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)
.
Не факт, что он вам понадобится, но в качестве упражнения попробуйте разобраться, как это работает.
Страшновато выглядит, да? Работает так (по строкам):
- Вызов
bind
сохраняет дополнительные аргументыargs
(они идут со 2-го номера) в массивbindArgs
. - … и возвращает обертку
wrapper
. - Эта обёртка делает из
arguments
массивargs
и затем, используя метод concat, прибавляет их к аргументамbindArgs
(карринг). - Затем передаёт вызов
func
с контекстом и общим массивом аргументов.