На самом деле это очень простая вещь. Внимательно почитайте десять минут, и вы пройдёте путь от полного недоумения до полного понимания!
Сначала разберитесь в следующем:
Пример 1

obj.objAge; // 17 obj.myFun() // 小张年龄 undefined
Пример 2

shows() // 盲僧
Сравните разницу в `this` между этими двумя. В первом случае `this` внутри выводимого результата указывает на `obj`; во втором случае у глобально объявленной функции `shows()` `this` имеет значение `window`;
1. `call()`, `apply()` и `bind()` все используются для переопределения объекта `this`!
Например:

obj.myFun.call(db); // 德玛年龄 99 obj.myFun.apply(db); // 德玛年龄 99 obj.myFun.bind(db)(); // 德玛年龄 99
Помимо дополнительных `()` после метода `bind`, все возвращаемые результаты одинаковы!
Из этого можно заключить, что `bind` возвращает новую функцию, и чтобы она выполнилась, её нужно вызвать.
2. Сравнение `call`, `bind` и `apply` при передаче параметров

obj.myFun.call(db,'成都','上海'); // 德玛 年龄 99 来自 成都去往上海 obj.myFun.apply(db,['成都','上海']); // 德玛 年龄 99 来自 成都去往上海 obj.myFun.bind(db,'成都','上海')(); // 德玛 年龄 99 来自 成都去往上海 obj.myFun.bind(db,['成都','上海'])(); // 德玛 年龄 99 来自 成都, 上海去往 undefined
Тонкое различие!
Из четырёх результатов выше нетрудно увидеть:
Первый параметр `call`, `bind` и `apply` — это объект, на который указывает `this`. Различие появляется со вторым параметром:
Параметры `call` указываются напрямую. Второй, третий и n-й параметры разделяются запятыми и помещаются сразу после него.obj.myFun.call(db,'Chengdu', ... ,'string' )。
Все параметры `apply` должны быть помещены в массив и переданы.obj.myFun.apply(db,['Chengdu', ..., 'string' ])。
Помимо возврата функции, `bind` принимает параметры так же, как `call`.
Конечно, параметры этих трёх не ограничиваются типом `string`. Они могут быть различных типов, включая функции, объекты и так далее!
Оригинальный адрес: https://www.cnblogs.com/Shd-Study/p/6560808.html