Out Of My Memory

雨垂れ石を穿つ

【JavaScript】this と アロー関数メモ

Javascriptにおける、thisのメモ

サマリ的な

  • (アロー関数をのぞき)関数の中で使用されているthisはその関数を呼び出している呼び出し元のオブジェクトをさす。
  • 関数の中に書かれたthisは、関数の呼び出し元から暗黙的(コードへの記述なし)に渡されている。暗黙的に渡されているthisは呼び出し元のオブジェクトそのものである。
  • アロー関数はthisを呼び出し元のオブジェクトから受け取らない。アロー関数は定義された場所(記述された場所)から一つ外側の関数のthisを受け取る。

コードによる具体例

Agent・・・代理人、doWorkメソッドを持つ。doWorkメソッドは与えられた関数を実行するだけ。
Person・・・私、極度の面倒くさがりのためAgent君を呼びつけ関数を渡して実行してもらおうとする。
 

下記コードは動かない例
"use strict";

const Agent = {
 doWork(callback){
  callback(); //渡した無名関数はここで実行されている。
 }
}

const Person = {
  name: "hiraku",
  requestWork(agent){
    agent.doWork(function(){
      console.log(this.name);
    })
  },
}

//  PersonがAgentに渡した無名関数はAgentのdoWorkメソッド内で実行される。
// そのためthis.nameはPersonオブジェクトのnameではない。
// これはエラーになる。
Person.requestWork(Agent);

解決方法の一つとしてアロー関数を使用するというのがある。

修正後コード
"use strict";

const Agent = {
 doWork(callback){
  callback();
 }
}

const Person = {
  name: "hiraku",
  requestWork(agent){
    agent.doWork(() => {
      console.log(this.name);
    })
  },
}

// エラーにならず「hiraku」が表示される!
Person.requestWork(Agent);

まとめ(サマリと同じ)

  • (アロー関数をのぞき)関数の中で使用されているthisはその関数を呼び出している呼び出し元のオブジェクトをさす。
  • 関数の中に書かれたthisは、関数の呼び出し元から暗黙的(コードへの記述なし)に渡されている。暗黙的に渡されているthisは呼び出し元のオブジェクトそのものである。
  • アロー関数はthisを呼び出し元のオブジェクトから受け取らない。アロー関数は定義された場所(記述された場所)から一つ外側の関数のthisを受け取る。