в чем разница между' 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 выше одинаковы?

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 может быть полезно, если у вас есть массив значений, которые вы хотите использовать в качестве аргументов.)