JSの中のapply、call、bindは深く理解します.
2163 ワード
Javascriptでは、Functionは対象です.Functionオブジェクトのthisは、関数が呼び出されることを決定する方式を指す.applyを使って、callとbindは関数オブジェクトの中のthisの方向を変えることができます.違いを言う前に、まず3つの類似点をまとめます.1、関数を変えるためのthisオブジェクトの方向です.2、最初のパラメータはすべてthisが指す対象です.3、後続のパラメータを利用して参照することができます.call方法:文法:call([thisObj],arg 1[,arg 2[, [.argN]]]定義:オブジェクトを呼び出す方法で、現在のオブジェクトを別のオブジェクトに置き換えます.説明:コール方法は、他のオブジェクトの代わりに一つの方法を呼び出すために使用されてもよい.call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisObjによって指定された新しいオブジェクトに変更することができる.thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される.apply:構文:appy(thisObj,配列パラメータ)定義:あるオブジェクトを適用する方法で、現在のオブジェクトの説明を別のオブジェクトに置き換えます.パラメータが配列タイプでない場合、Type Errエラーが発生します.bit:EcmaScript 5にbindというメソッドが拡張されました.(IE 6,7,8はサポートされていません.)bindはcallに似ています.例えば、許容可能なパラメータは両方に分けられています.そして、最初のパラメータは実行時関数コンテキストのthisのオブジェクトです.違いは①bindの戻り値は関数です.②後のパラメータの使用にも違いがあります.
まず例を見ます
に対して、applyはこのように使えます.add.apply(sub,[3,1])は4です.
ビットに対して、このように使用することができる:add.bind(sub)(3,1);結果は4
出力結果は同じですが、使い方が違います.
例二を見てください
まず例を見ます
function add(a, b) {
alert(a + b);
}
function sub(a, b) {
alert(a - b);
}
はい、callはこのように使えます.add.call(sub,3,1)は4です.に対して、applyはこのように使えます.add.apply(sub,[3,1])は4です.
ビットに対して、このように使用することができる:add.bind(sub)(3,1);結果は4
出力結果は同じですが、使い方が違います.
例二を見てください
function jone(name,age,work){
this.name=name;
this.age=age;
this.work=work;
this.say=function(msg){
alert(msg+", "+this.name+", "+this.age+" , "+this.work)
}
}
var jack={
name:"jack",
age:'24',
work:" "
}
var pet=new jone();
pet.say.apply(jack,[" "])
console.log(this.name)
callには、pet.say.call(jack,「いらっしゃいませ!」)が必要です.appyに対しては、pet.say.appy(jack,「いらっしゃいませ!」)がbindに対して必要です.pet.say.bind(jack,「いらっしゃいませ」)は、このとき出力consolie.logs(this.name)が発生しました.