En realidad es algo muy simple; si lo miras con atención durante diez minutos, pasarás de estar totalmente confundido a entenderlo por completo.

Primero entiende lo siguiente:

Ejemplo 1

obj.objAge;  // 17
obj.myFun()  // 小张年龄 undefined

Ejemplo 2

shows()  // 盲僧 

Compara la diferencia de this entre ambos: en el primero, this dentro del console.log apunta a obj; en el segundo, en la función shows() declarada globalmente, this es window.

1. call(), apply() y bind() se usan para redefinir el objeto this.

Por ejemplo:

obj.myFun.call(db);    // 德玛年龄 99
obj.myFun.apply(db);    // 德玛年龄 99
obj.myFun.bind(db)();   // 德玛年龄 99

Excepto por el () adicional al final del método bind, los resultados devueltos son todos iguales.

De esto se concluye que bind devuelve una nueva función; debes invocarla para que se ejecute.

2. Comparando call, bind y apply en cuanto a pasar parámetros

 
obj.myFun.call(db,'成都','上海');     // 德玛 年龄 99  来自 成都去往上海
obj.myFun.apply(db,['成都','上海']);      // 德玛 年龄 99  来自 成都去往上海  
obj.myFun.bind(db,'成都','上海')();       // 德玛 年龄 99  来自 成都去往上海
obj.myFun.bind(db,['成都','上海'])();   // 德玛 年龄 99  来自 成都, 上海去往 undefined
  

¡Una diferencia sutil!

No es difícil ver a partir de los cuatro resultados anteriores:

El primer parámetro de las tres funciones call, bind y apply es el objeto al que apunta this; aquí es donde surge la diferencia con el segundo parámetro:

Los parámetros de call se colocan directamente; el segundo, el tercer y el enésimo parámetro se separan con comas y se ponen al final.obj.myFun.call(db,'Chengdu', ... ,'string' )。

Todos los parámetros de apply deben pasarse dentro de un array.obj.myFun.apply(db,['成都', ..., 'string' ])。

Además de que bind devuelve una función, sus parámetros son iguales que los de call.

Por supuesto, los parámetros de los tres no se limitan al tipo string; se permiten varios tipos, incluyendo funciones, objetos, etc.

Dirección original: https://www.cnblogs.com/Shd-Study/p/6560808.html