適用、バインド、バインディングのこの方法をcall--

Function.prototype.call()、Function.prototype.applyの()、Function.prototype.bind()

この変更内部関数は、三点である(すなわち、ここで関数が実行されたときにスコープ)方法。

 

1.Function.prototype.call(thisValue、PARAM1、PARAM2、....)

1)最初の引数

最初の引数はでなければならないオブジェクト、

  • それがある場合はnull、空、未定義、ウィンドウにバインドされたデフォルトでは、
  • 番号(5)のような自動基本型パッケージタイプに塩基の種類(例えば、文字、数字、ブール値)、もし
  • これなら、現在のスコープを表現するためにバインドされています
VAR N = 123 VAR OBJ = { 
    N: 456 
} 
機能(){
     戻り 、これを
} 
// この===ウィンドウ 
a.call()。// ウィンドウ 
a.call(ヌル); // ウィンドウ 
a.call(未定義)。// ウィンドウ 
a.call(ウィンドウ)。// ウィンドウ
// この=== OBJ 
a.call(OBJ)。// OBJ 
// この===对象包装 
a.call(5); // 番号(5){[[PrimitiveValue]:5}

2)残りのパラメータ

関数呼び出しのパラメータとして渡されたパラメータの残りの部分

機能追加(A、B){
   戻り A + 、B 
} 
// これは、この電流の固定点を表し; ===このウィンドウ 
add.call(、1、2); //を3

3)アプリケーション

// ネイティブメソッド呼び出しオブジェクト
 VAR OBJ = { 
  A: 5 
} 
にconsole.log(obj.hasOwnProperty( 'のtoString')); // fasle 
obj.hasOwnProperty =関数(){ // 覆わOBJオブジェクトはプロトタイプチェーンから継承方法
  リターン trueに ; // 変更自体OBJメソッド、メソッドのプロトタイプチェーン定数である
} 
はconsole.log(obj.hasOwnProperty(「のtoString」)); // trueに
// OBJ鎖プロトタイプ法に使用することができます使用OBJスコープhasOwnPropertyを法表し 
はconsole.log(Object.prototype.hasOwnProperty.call(OBJを)); // falseに

2. Function.prototype.applyの(thisValue、[PARAM1、...])

1)最初の引数とコールの規則の方法と同様

2)第二のパラメータ

二番目のパラメータである配列、配列パラメータは、コールの引数としてました

機能追加(B){
   戻り A + B。
} 
add.apply(この、[1、2])

3)アプリケーション

// 1)配列の最大値を探す 
CONST ARR = [1,3,5 、] 
Math.max.apply(ヌル、ARR); // 5 
// また 
Math.max(ARR ...); //を5 

// 2)空の未定義へのエントリのアレイを、UNDEFINEを横断することができるが、空の無視機能を横断している 
CONST ARR = [1 ,, 4 ;] 
Array.apply(ヌル、ARR); // [1、未定義。 、4]配列配列コンストラクタであります

 

3. Function.prototype.bind(thisValue、パラメータ、パラメータ2 ...)

1)最初の引数

同じ呼び出し、メソッドを適用

2)

 

4. apply.call、バインドの違い

呼び出し後1)メソッドの呼び出しと直ちに結合この等価の実施後、適用します

2)bindメソッドはすぐに実装されていない新しい関数を返します

アプリケーション:

配列の配列に1)クラス

// 1)ベースのアレイの配列に
// 適用し、直ちに実行Callメソッド 
Array.prototype.slice.apply({0:1、長さ:1 、}); 
Array.prototype.slice.call({ 0:1 、長さ:. 1 });
 // 新しい機能が増加()の後ろに、手動で実行する必要が発生するバインド方法 
Array.prototype.slice.bind({0 :. 1、長さ:. 1})();

2)コールバック関数にオブジェクトを結合

// 2)結合コールバック関数をターゲット; 
// バインドされていない前に、このコールバック関数、一般的に、ウィンドウ
のvar名= 'Hello Worldの' ;
 VAR OBJ = { 
  名: 'ライラ' 
  タイムズ:[ 1。 1,2,4 ]、
  プリント:関数(){ 
    にconsole.log(この === OBJ); // trueに
    この .times.forEach(関数(){ 
      にconsole.log(この ===ウィンドウ); // trueに 
      console.log(この .nameの);   // Hello Worldの
    })
  } 
} 
obj.print();

// バインド使用して、このコールバックメソッドにバインディング
するvar名= 'Hello Worldのを' ;
 VAR OBJ = { 
  名: 'ライラ'
  タイムズ:[ 1,2,4 ]、
  印刷:機能(){
     これは .times。 forEachの((関数(){ 
      にconsole.log(この); // OBJ --- 3回 
      にconsole.log(この .nameの);   // ライラ--- 3ビュー 
    } .bind())) // 呼び出すことはできません、直ちに実行されるように、それがもはや機能である、あるいは適用されない、関数は、デフォルトの戻り値undefinedを返し
  } 
}
obj.print(); 

// ;使用の呼び出しは、このコールバック関数をバインドする方法を適用
するvar名= 'Hello Worldの' ;
 VAR OBJ = { 
  名: 'ライラ' 
  タイムズ:[ 1,2,4 ]、
  印刷:関数(){ 
    CONST = これをこの .times.forEach((関数(){ // ため適用、呼が直ちに実行されるので、ネストされた一つの関数関数生命維持(){ 
        にconsole.log() ; // OBJ --- 3回 
        はconsole.log(この .nameの);   //ライラ--- 3回
      })コール(それは);. // 適用置き換えることができます。生命維持には、括弧内の関数式にそれを拡張する必要があります。それ以外の場合は、関数宣言はcallメソッドを呼び出すことはできません。
    }))
  } 
} 
Obj.print()。

 

 

 

おすすめ

転載: www.cnblogs.com/lyraLee/p/11441879.html