Старый пост, но новый подход;)
Function.prototype.bind = function(){
var fn = this,
context = arguments[0],
args = Array.prototype.slice.call(arguments, 1);
return function(){
return fn.apply(context, args.concat([].slice.call(arguments)));
}
}
obj = {'abc':'x'};
var func = function() {
console.log(arguments);
alert(this.abc);
}
var x = func.bind(obj);
console.log(x(1,2,3));
Это очень хороший пример для объяснения. Запустите его и проверьте журнал консоли.
Затем измените код, чтобы пропустить
[].slice.call(arguments)
Вы увидите, что console.log выполнения x (1,2,3) больше не показывает аргументы. Это потому, что аргументы объектов являются локальной переменной во всех функциях.
Это может показаться немного запутанным, но в основном это означает:
var x = func.bind(obj,1,2,3);
Возвращает эту функцию внутри:
function() {
return fn.apply(obj, [1,2,3].concat([].slice.call(arguments)));
}
Так что это скорее шаблон для функции.
Когда вы сейчас запустите его, как:
x(4,5,6)
Это будет выполняться:
fn.apply(obj, [1,2,3].concat([].slice.call(arguments)))
со специальным аргументом object = {0: 4,1: 5,2: 6}, который можно преобразовать в массив с помощью [] .slice.call
где arguments - это локальный объект, который автоматически присваивается при вызове функции.