バインド[JS]関数


コールバックメソッドまたは値として渡されて呼び出されると、thisの情報は消えます.
let user = {
    name : 'yuno',
    sayHi() {
        console.log(`${this.name}` hi);
    },
}

setTimeout(user.sayHi, 1000);
settimeoutメソッドのパラメータuserとして使用します.sayHiメソッドを超えた
settimeoutはコールバック関数のuserです.sayHiをスケジューラに転送し、時間が経過したときに実行します.
コールバック関数を呼び出すと、ブラウザ環境のsettimeoutがwindowとして指定されます.
window.nameはundefinedになります.
1秒後、コンソールから「undefined hi」が出力されます.
正しいコンテキストで実行する方法は、大きく2つあります.
歌い手
Rapper関数を使用します.
setTimeout(()=> {user.sayHi()}, 1000);
Rapper関数でuserを使用します.sayHi()外部変数ユーザオブジェクトを検索します.
通常、メソッドを実行します.
ただし、コールバックを実行する前にユーザーが変更した場合は、変更したオブジェクトのメソッドが実行されます.
ユーザーが1秒以内に消えた場合、上記のコードはエラーを引き起こします.
bindメソッド
すべての関数は組み込みメソッドbindをサポートしており、このメソッドを変更できます.
func.bind(context)
コンテキストに固定された変換(特殊オブジェクト)を返します.
呼び出しはcontext funcを呼び出すのと同じ効果を生じます.
let sayHi = user.sayHi.bind(user);
setTimeout(sayHi, 1000); // yuno hi
func.bind(context [,arg1][,arg2] ...)
bind関数はパラメータをバインドしてもよいし、パラメータをバインドしてもよい.
//multiple : 2개의 인자를 곱해주는 함수

let double = multiple.bind(null,2);
double(2) // 4
これにより、最初のパラメータがnull、最初のパラメータが2の複数の関数の変形を作成できます.
この方法を部分応用(partialアプリケーション)と呼ぶ.
ローカルアプリケーションは、読み取り可能な独立した関数を作成します.
包括的な関数を使用して、あまり包括的でない変換関数を作成できます.