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

Сначала разберитесь в следующем:

Пример 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