バインド[JS]関数
4556 ワード
コールバックメソッドまたは値として渡されて呼び出されると、thisの情報は消えます.
settimeoutはコールバック関数のuserです.sayHiをスケジューラに転送し、時間が経過したときに実行します.
コールバック関数を呼び出すと、ブラウザ環境のsettimeoutがwindowとして指定されます.
window.nameはundefinedになります.
1秒後、コンソールから「undefined hi」が出力されます.
正しいコンテキストで実行する方法は、大きく2つあります.
歌い手
Rapper関数を使用します.
通常、メソッドを実行します.
ただし、コールバックを実行する前にユーザーが変更した場合は、変更したオブジェクトのメソッドが実行されます.
ユーザーが1秒以内に消えた場合、上記のコードはエラーを引き起こします.
bindメソッド
すべての関数は組み込みメソッドbindをサポートしており、このメソッドを変更できます.
func.bind(context)
コンテキストに固定された変換(特殊オブジェクト)を返します.
呼び出しはcontext funcを呼び出すのと同じ効果を生じます.
bind関数はパラメータをバインドしてもよいし、パラメータをバインドしてもよい.
この方法を部分応用(partialアプリケーション)と呼ぶ.
ローカルアプリケーションは、読み取り可能な独立した関数を作成します.
包括的な関数を使用して、あまり包括的でない変換関数を作成できます.
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アプリケーション)と呼ぶ.
ローカルアプリケーションは、読み取り可能な独立した関数を作成します.
包括的な関数を使用して、あまり包括的でない変換関数を作成できます.
Reference
この問題について(バインド[JS]関数), 我々は、より多くの情報をここで見つけました https://velog.io/@hanganda23/JS-함수-바인딩テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol