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()。