実はとても簡単なもので、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