Какая разница между 'call/apply' и 'bind'
var obj = {
x: 81,
getX: function() {
console.log( this.x)
}
};
var getX = obj.getX.bind(obj);//use obj as 'this';
getX();//81
var getX = function(){
obj.getX.apply(obj);
}
getX();//also 81
Использование bind и call/apply выглядит очень похоже, я хочу знать, какая разница между ними. Две функции getX выше одинаковы?
Ответы
Ответ 1
bind
возвращает функцию, которая будет действовать как исходная функция, но с this
предопределена. Он обычно используется, когда вы хотите передать функцию обработчику события или другому обратному вызову async.
call
и apply
вызовет функцию, сразу же позволяющую указать как значение this
, так и любые аргументы, которые получит функция.
Второй пример определяет анонимную функцию, которая вызывает apply
. Это общая картина; bind
обеспечивает стандартную реализацию того, что позволяет вам делать это с помощью простого вызова функции (таким образом, это быстрее и легче писать).
Ответ 2
.call()
- вызывает ту же функцию с указанными аргументами
.apply()
- вызывает ту же функцию с аргументами, указанными в массиве
.bind()
- создает новую функцию с тем же самым телом функции с заданным значением this
(первый аргумент) и возвращает эту функцию.
Во всех случаях первый аргумент используется как значение this
внутри функции.
Ответ 3
Разница в том, как вы делаете вызов. Если вы использовали bind
для возврата функции со значением bound this
, вы просто вызываете функцию:
getx();
Если у вас нет связанной функции, и вы хотите установить this
, вы делаете это с помощью call
или apply
:
someFunction.call(objectToUseAsThis, arg1, arg2);
// or
someFunction.apply(objectToUseAsThis, [arg1, arg2]);
Обратите внимание, что если у вас есть связанная функция (например, ваш getX
), использование call
на ней бессмысленно, потому что this
, которое вы поставляете, будет просто переопределено границей this
. (Использование apply
может быть полезно, если у вас есть массив значений, которые вы хотите использовать в качестве аргументов.)