в чем разница между' call/apply 'и' bind ' [дубликат]
этот вопрос уже есть ответ здесь:
- Javascript call () & apply () vs bind ()? 16 ответов
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 выше одинаковы?
3 ответов
bind
возвращает функцию, которая будет действовать как исходная функция, но с this
предопределенный. Он обычно используется, когда вы хотите передать функцию обработчику событий или другому асинхронному обратному вызову.
call
и apply
немедленно вызовет функцию, позволяющую указать оба значения this
и любые аргументы, которые получит функция.
ваш второй пример определяет анонимную функцию, которая называет apply
. Это общая закономерность;bind
обеспечивает стандартную реализацию того, что позволяет сделать это с помощью простого вызова функции (таким образом, быстрее и проще писать).
.call()
- вызывает ту же функцию с указанными аргументами
.apply()
- вызывает ту же функцию с аргументами, указанными в массиве
.bind()
- создает новую функцию с тем же телом функции с заданным значением this
(первый аргумент) и возвращает эта функция.
во всех случаях первый аргумент используется как значение this
внутри функции.
разница в том, как вы звоните. Если вы использовали bind
чтобы вернуть функцию с привязкой this
значение, вы просто вызов функции:
getx();
если у вас нет привязанной функции, и вы хотите установить this
, вы делаете это с call
или apply
:
someFunction.call(objectToUseAsThis, arg1, arg2);
// or
someFunction.apply(objectToUseAsThis, [arg1, arg2]);
обратите внимание, что если у вас есть привязанная функция (например,getX
), используя call
на нем бессмысленно, потому что this
вы поставляете просто получить переопределен bound this
. (Используя apply
может быть полезно, если у вас есть массив значений, которые вы хотите использовать в качестве аргументов.)