call、appy、bindの応用と違い
4505 ワード
call、appy、bindの役割は、関数の運転時のthisの方向を変えることであり、thisの使い方に関しては、前の記事JavaScriptの中のthisの4つの呼び出しパターンを読むことができます.
コール
call方法の最初のパラメータは、thisに結合される値であり、後に入ってくるのはパラメータリストである.最初のパラメータがnull、undefinedの場合、デフォルトはwindowを指します.
applyは二つのパラメータを受け取ります.最初のパラメータはthisに結合される値で、二つ目のパラメータはパラメータ配列です.最初のパラメータがnull、undefinedの場合、デフォルトはwindowを指します.
callとapplyは他のオブジェクトを借りる方法に用いることができます.ここではcall()を例とします.
いつどんな方法を使うべきですか?実は気にしなくてもいいです.あなたのパラメータがもともと一つの配列の中にあるなら、自然にapplyを使います.パラメータが乱れているなら、お互いの間に何の関係もないです.コールを使います.上のように一組の数の中で最大の値の例を探して、もちろんappyを使うのが合理的です.
ビッド
callとよく似ていますが、最初のパラメータはthisの指向であり、2番目のパラメータからは受信パラメータのリストです.違いは、bind方法の戻り値は、関数およびbind受信のパラメータリストの使用である. bitリターン値は、関数 である.パラメータの使用
callは2つ目以降のパラメータをfnメソッドとして実装していますが、fn 1メソッドの実装はbind中のパラメータに基づいて後の列にします.
apply、call、bind比較
では、apply、call、bindの3つを比べたら、何か違いがありますか?いつappy、callを使いますか?いつbindを使いますか?簡単な例:
つまり、文脈環境を変えたいなら、すぐに実行するのではなく、折り返し実行する場合に、bind()を使用するのが違いです.アプリ/callはすぐに関数を実行します.
もう少しまとめてみます appy、call、bindの3つは、関数を変更するためのthisオブジェクトの指向です. appy、call、bindの3つの最初のパラメータはいずれもthisが指すオブジェクト、すなわち指定したいコンテキストです. appy、call、bindの3つは、後続のパラメータを使用して参照することができます. bit は、対応する関数を返します.後で起動しやすくなります.apply、callはすぐ呼び出します.
参照 http://www.cnblogs.com/tylerdonet/p/4864116.html
https://www.jianshu.com/p/bc541afad6ee
コール
call方法の最初のパラメータは、thisに結合される値であり、後に入ってくるのはパラメータリストである.最初のパラメータがnull、undefinedの場合、デフォルトはwindowを指します.
var arr = [1, 2, 3, 89, 46];
var max = Math.max.call(null, arr[0], arr[1], arr[2], arr[3], arr[4]);//89
理解できます.obj1.fn();
obj1.fn.call(obj1);
fn1();
fn1.call(null);
f1(f2);
f1.call(null,f2);
一例を見てくださいvar obj = {
message: 'My name is: '
}
function getName(firstName, lastName) {
console.log(this.message + firstName + ' ' + lastName);
}
getName.call(obj, 'Dot', 'Dolby');
appyapplyは二つのパラメータを受け取ります.最初のパラメータはthisに結合される値で、二つ目のパラメータはパラメータ配列です.最初のパラメータがnull、undefinedの場合、デフォルトはwindowを指します.
var arr = [1,2,3,89,46];
var max = Math.max.apply(null,arr);//89
理解できます.obj1.fn();
obj1.fn.apply(obj1);
fn1();
fn1.apply(null);
f1(f2);
f1.apply(null,f2);
前に書いたコールの使い方と似ていると思いますか?実際にはapplyとcallの使い方はほぼ同じです.唯一の違いは、関数が複数の変数を伝達する必要がある場合、appyは一つの配列をパラメータとして入力し、callは一連の単独変数を受け入れることです.一例を見てくださいvar obj = {
message: 'My name is: '
}
function getName(firstName, lastName) {
console.log(this.message + firstName + ' ' + lastName);
}
getName.apply(obj, ['Dot', 'Dolby']);// My name is: Dot Dolby
Objは関数コンテキストのオブジェクトとして、関数get NameのthisがObjというオブジェクトを指していることがわかる.パラメータfirst NameとlastNameは、配列に入れてget Name関数に入る.callとapplyは他のオブジェクトを借りる方法に用いることができます.ここではcall()を例とします.
var Person1 = function () {
this.name = 'Dot';
}
var Person2 = function () {
this.getname = function () {
console.log(this.name);
}
Person1.call(this);
}
var person = new Person2();
person.getname(); // Dot
上から私達はPerson 2の実用化された対象のpersonがgetname方法でPerson 1のnameを手に入れたのを見ました.Person 2では、Person 1.call(this)の役割は、thisオブジェクトの代わりにPerson 1のオブジェクトを使用するので、Person 2は、Person 1の属性と方法のすべてを持っています.Person 2がPerson 1の属性と方法を継承したのに相当します.いつどんな方法を使うべきですか?実は気にしなくてもいいです.あなたのパラメータがもともと一つの配列の中にあるなら、自然にapplyを使います.パラメータが乱れているなら、お互いの間に何の関係もないです.コールを使います.上のように一組の数の中で最大の値の例を探して、もちろんappyを使うのが合理的です.
ビッド
callとよく似ていますが、最初のパラメータはthisの指向であり、2番目のパラメータからは受信パラメータのリストです.違いは、bind方法の戻り値は、関数およびbind受信のパラメータリストの使用である.
var obj = {
name: 'Dot'
}
function printName() {
console.log(this.name);
}
var dot = printName.bind(obj)
console.log(dot); // function () { … }
dot(); // Dot
bind方法はすぐには実行されず、コンテキストthisを変更した関数を返します.もとの関数printNameの中のthisは変えられていないで、依然として大域の対象windowを指します.function fn(a, b, c) {
console.log(a, b, c);
}
var fn1 = fn.bind(null, 'Dot');
fn('A', 'B', 'C'); // A B C
fn1('A', 'B', 'C'); // Dot A B
fn1('B', 'C'); // Dot B C
fn.call(null, 'Dot'); // Dot undefined undefined
面白い問題がありますが、もし連続して二回、或いは連続して三回なら出力の値は何ですか?このように:var bar = function(){
console.log(this.x);
}
var foo = {
x:3
}
var sed = {
x:4
}
var func = bar.bind(foo).bind(sed);
func(); //?
var fiv = {
x:5
}
var func = bar.bind(foo).bind(sed).bind(fiv);
func(); //?
答えは、期待の4と5ではなく、2回とも3を出力します.なぜなら、Javascriptでは、複数回bind()が無効になっているからです.より深いレベルの原因は、bind()の実装は、使用関数が内部で1つのcall/applyを包んだことに相当し、2番目のbind()は、もう1回のbind()を包むのに相当しますので、2回目以降のbindは有効になりません.callは2つ目以降のパラメータをfnメソッドとして実装していますが、fn 1メソッドの実装はbind中のパラメータに基づいて後の列にします.
apply、call、bind比較
では、apply、call、bindの3つを比べたら、何か違いがありますか?いつappy、callを使いますか?いつbindを使いますか?簡単な例:
var obj = {
x: 81,
};
var foo = {
getX: function() {
return this.x;
}
}
console.log(foo.getX.bind(obj)()); //81
console.log(foo.getX.call(obj)); //81
console.log(foo.getX.apply(obj)); //81
三つの出力は81ですが、bind()の使い方を注意してみてください.彼の後ろには括弧が多くなりました.つまり、文脈環境を変えたいなら、すぐに実行するのではなく、折り返し実行する場合に、bind()を使用するのが違いです.アプリ/callはすぐに関数を実行します.
もう少しまとめてみます
参照 http://www.cnblogs.com/tylerdonet/p/4864116.html
https://www.jianshu.com/p/bc541afad6ee