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