実はとても簡単なもので、10分真剣に見れば、わけがわからない状態から完全に理解できます!
まず以下を理解しましょう:
例1

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

shows() // 盲僧
これら2つのthisの違いを比較してみましょう。最初の出力内のthisはobjを指し、2番目のグローバル宣言された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
微妙な違いがあります!
上の4つの結果から容易にわかるように:
call、bind、applyという3つの関数の最初の引数はすべてthisの指すオブジェクトですが、2番目の引数で違いが出てきます:
callの引数は直接渡されます。2番目、3番目、n番目の引数はすべてカンマで区切って、そのまま後ろに置きます。obj.myFun.call(db,'成都', ... ,'string' )。
applyのすべての引数は配列の中に入れて渡す必要があります。obj.myFun.apply(db,['成都', ..., 'string' ])。
bindは関数を返す以外は、その引数はcallと同じです。
もちろん、3つの引数はstring型に限定されず、関数やobjectなど、あらゆる型を許可しています!
原文アドレス:https://www.cnblogs.com/Shd-Study/p/6560808.html