1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

bind()とthisは、セットに理解するのがいい。

Last updated at Posted at 2022-03-10

今回は bind() に関して理解を深めたいと思います。

bind() について。

bind() メソッドは、呼び出された際に this キーワードに指定された値が設定される新しい関数を生成します。

Function.prototype.bind()

なるほど、thisを指定するんだな、新しい関数を作るんだな というのがわかりました。

thisの中身を見ていく

bindはthisには深い関係にありますので、まずは this の中身について見ていきましょう。

const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this) // これな何になる?
    console.log(this.name + ' clicked');
  }
};

testFunk.onClick();

実行すると、このような結果が得られました。
スクリーンショット 2022-03-09 13.54.50.png
※choromeの開発者ツールで実行しています

thisが参照しているオブジェクトはtestFunkだとわかりました。

[ここがthisの対象].showName();

続いて、showNameを追加し、そちらから実行してみます。

const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this)
    console.log(this.name + ' clicked');
  },
  showName: { // 追加
    name: '二郎',
    onClick() {
        console.log(this)
        console.log(this.content + ' clicked your button')
    }
  }  
};

testFunk.showName.onClick();

スクリーンショット 2022-03-09 14.02.43.png

thisが参照しているオブジェクトは、showNameだとわかりました。

[testFunk].[ここがthisの対象].showName();

続いて、メソッドを別の変数に格納した場合はどうなるでしょうか.

const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this)
    console.log(this.name + ' clicked');
  }
};

const animal = testFunk.onClick; // animalに格納する
animal(); 

スクリーンショット 2022-03-10 21.32.25.png

thisグローバルオブジェクト(window) になってしまいました。
this.nameグローバルオブジェクトに存在しないので undefined になっています。

window.onClick();

このことから、thisは実行する方法によって変わることがわかりました。
ここまで、thisの理解が少しは深まったかと思います。

bind()

やっとbindのお話です。
bindの説明を思い出してみましょう。

this キーワードに指定された値が設定される新しい関数を生成します。

つまり何をthisとおくか指定することができます。
先ほどグローバルがthisになってしまった例に、bindを用いてthisを操ってみます。

const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this)
    console.log(this.name + ' clicked');
  }
};

const animal = testFunk.onClick.bind(testFunk); // thisはtestFunkにしてくれ
animal(); 

スクリーンショット 2022-03-10 21.40.31.png

やりました!
thisグローバルになっていません。testFunkのままにすることができました!


続いて、bindshowNameを入れてみます。

const testFunk = {
  name: '太郎',
  onClick() {
    console.log(this)
    console.log(this.name + ' clicked');
  }
}

const showName = {
  name: '二郎',
};

const hoge = testFunk.onClick.bind(showName);
hoge();

スクリーンショット 2022-03-10 21.48.58.png

showNamethis とすることができました!


長くなってきたのでいったんここで切りますね!

次回は bindをアロー関数で使用したらどうなるのか を書いていきます。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?