以前、HTML5プロフェッショナル認定試験の学習をしていた際bind()
というものが出てきました。
存在は知っていましたが、実際に使用した経験がなかったため今回調べてみました。
bind()とは
bind()
とは一体何でしょうか。
MDNには下記のように記載されています。
bind() メソッドは新しい関数を生成し、これは呼び出された際に this キーワードに指定された値が設定されます。この値は新しい関数が呼び出されたとき、一連の引数の前に置かれます。
どうやらbind()
は
- 新しい関数を生成する
- thisに関係する
ようです。
では実際、どのように使用するのか見ていきましょう。
使用例
例えばbind()
を使用せずに関数内でthis
を参照する場合、挙動が意図と異なる場合がありますが、bind()
を使用すれば解決します。
bind()
を使用しない場合
下記の例では、関数greet
をperson.hello
に代入していますが、greet()
を呼び出すとthis
がperson
オブジェクトを参照していないためundefined
になります。
const person = {
name: "Kenny",
hello: function(){
console.log(`Hello, my name is ${this.name}`);
}
};
const greet = person.hello;
greet(); // "Hello, my name is undifined"
bind()
を使用する場合
一方、bind()
を使用することで関数hello
をperson
オブジェクトに結び付けることができます。
これにより、greet()
を実行したときにthis
が常にperson
オブジェクトを指すためにthis.name
はKenny
となります。
const person = {
name: "Kenny",
hello: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
const greet = person.hello.bind(person);
greet(); // "Hello, my name is Kenny"
bind()
の引数を指定する場合
bind()
は引数を取ることもできます。
次のように記述することで、
対象の関数のthis
の参照先を変更した関数を新たに生成することができます。
bind(thisArg, arg1, …, argN)
引数 | 説明 |
---|---|
第一引数 | thisの参照先 |
第二引数以降 | 関数で使用する引数 |
下記は引数を指定する場合の例です。
function introduce(greeting, punctuation) {
console.log(`${greeting}, my name is ${this.name}${punctuation}`);
}
const person = {name: "Kenny"};
const bindIntroduce = introduce.bind(person, "Merhaba", "!");
bindIntroduce(); // Merhaba, my name is Kenny!
まとめ
bind()
は意図したオブジェクトをthis
として使用できるようにするのですね。
メリットとしては下記のようなものがあげられるかなと思います。
-
this
の中身を固定できるので予期せぬthis
の変更を防ぐことができる - 設定を保持した関数を作成できるので再利用できる
それでは。
参考文献