call、appy、bindの3つの使い方と違い
9518 ワード
1.コール
call、appy、bindはいずれもthisの方向を変える方法です. fn.call 現在の例(関数fn)は、プロトタイプチェーンのルックアップメカニズムにより、 fn.call() 発見されたコールの詳細 非厳格モード パラメータを渡さない場合、または最初のパラメータが厳格モード 最初のパラメータは誰ですか?thisは誰を指しますか?nullとundefinedを含めて、パラメータを伝えないとundefinedです. apply:callとほぼ同じで、唯一の違いは伝え方 です.
applyはfnに渡す必要があるパラメータを一つの配列(またはクラス配列)に入れて伝達します.書いたのは配列ですが、fnに一つずつ渡すのにも相当します. bind:文法はcallと同じで、すぐ実行するかそれとも実行するかに違いがあります.bindは互換性がありません.IE 6~8 .
call、appy、bindはいずれもthisの方向を変える方法です.
function.prototype
上のcall
方法を発見し、function call(){[native code]}
call
方法を実行し、call
方法を実行すると、内部処理が行われます.まず、動作する関数のうちのthisキーワードをcall
方法の最初の転送の実参加2に変更します.call
方法の第二及びその後の実パラメータを3に取得します.操作する関数を実行します.そして、二つ目以降に渡された参加者を関数に伝達します.fn.call([this],[param]...)
null
またはnudefined
であり、this
はwindow
を指す. let fn = function(a,b){
console.log(this,a,b);
}
let obj = {name:"obj"};
fn.call(obj,1,2); // this:obj a:1 b:2
fn.call(1,2); // this:1 a:2 b:undefined
fn.call(); // this:window a:undefined b:undefined
fn.call(null); // this=window a=undefined b=undefined
fn.call(undefined); // this=window a=undefined b=undefined
"use strict"
let fn = function(a,b){
console.log(this,a,b);
}
let obj = {name:"obj"};
fn.call(obj,1,2); // this:obj a:1 b:2
fn.call(1,2); // this:1 a:2 b=undefined
fn.call(); // this:undefined a:undefined b:undefined
fn.call(null); // this:null a:undefined b:undefined
fn.call(undefined); // this:undefined a:undefined b:undefined
2.appyapplyはfnに渡す必要があるパラメータを一つの配列(またはクラス配列)に入れて伝達します.書いたのは配列ですが、fnに一つずつ渡すのにも相当します.
fn.call(obj, 1, 2);
fn.apply(obj, [1, 2]);
3.ビンfn.call(obj, 1, 2); // fn this, fn
fn.bind(obj, 1, 2); // fn this,fn
thisはobjに変更されましたが、バインディングすると直ちに実行されます.クリックイベントをトリガすると、fnの戻り値undefinedが実行されます.document.onclick = fn.call(obj);
bindはfn中のthisをobjとして前処理します.fnは実行していません.クリックした時にfnを実行します.document.onclick = fn.bind(obj);