javascriptのcall、appy概念を全面的に理解します.

3226 ワード

まず、Java scriptの関数の暗黙的パラメータについて話したいです.
 
Agments
 
オブジェクトは、実行中の関数とその関数を呼び出すパラメータを表します.
[function.]アーグメンント[n]パラメータfunction:オプション.現在実行中のFunctionオブジェクトの名前.n:オプション.Functionオブジェクトに渡す0からのパラメータ値インデックスです. 説明
Agmentsは関数コールを行う場合、指定されたパラメータの他に作成された隠しオブジェクトです.Agmentsは配列のようなアクセス特性と方式を持っているので、argments[n]によって対応する単一パラメータの値にアクセスでき、配列長属性lengthを持っているという配列のようなオブジェクトではない.また、argmentsオブジェクトは、関数宣言によって定義されたパラメータリストに限定されず、実際に関数に伝達されるパラメータを格納し、argmentsオブジェクトを明示的に作成することができません.アーグメンントオブジェクトは関数の開始時のみ使用できます.これらの性質を以下の例で詳しく説明します.
 
 
//arguments      。
function ArgTest(a, b){
   var i, s = "The ArgTest function eXPected ";
   var numargs = arguments.length;     //           。
   var expargs = ArgTest.length;       //          。
   if (expargs < 2)
      s += expargs + " argument. ";
   else
      s += expargs + " arguments. ";
   if (numargs < 2)
      s += numargs + " was passed.";
   else
      s += numargs + " were passed.";
   s += "

"    for (i =0 ; i < numargs; i++){      // 。    s += "  Arg " + i + " = " + arguments[i] + "
";    }    return(s);                          // 。 }
 
 アプリとコールの方法
 それらの役割は、関数を別のオブジェクトに結びつけて実行することであり、両者はパラメータの定義の仕方だけで違いがあります.
    apple(object、args)
    call(object);
 つまり、関数内部のthisポインタはすべてobjectとして割り当てられます.これは関数を別のオブジェクトとして動作させる目的を実現できます.
 
 アプリの説明
 apply()方法は二つのパラメータがあり、objectはthisのオブジェクトとして使用し、argsは関数に伝達するパラメータの配列を表しています.
 もし argsは有効な配列ではないか、あるいはargmentsオブジェクトではない場合、TypeErrを引き起こすことになります. 提供していない場合 アークスと objectのいずれかのパラメータは、Globalオブジェクトとして使用されます. object,  そして、どのパラメータも渡されませんでした.例をあげて説明します
 
 
function hello(prefix,suffix){
    alert(prefix+this.word+suffix);
}

var obj = new Object();
obj.word = "admin";

/*
      apply  ,      obj,      hello()  this     
    obj.            , hello      ;         
     "Welcome admin to my page".    ,obj    hello         
*/
hello.apply(obj,new Array("Welcome "," to my page"));
 
 コールの説明
 call方法は、関数のオブジェクトコンテキストを初期のコンテキストから objectで指定された新しいオブジェクトです. 提供していない場合 objectパラメータは、Globalオブジェクトとして使用されます. object.その使用は前の例と非常に似ています.hello.apply(obj,new Aray)をハロー.callに変更した後、
効果は前の例とまったく同じです.ここでは重複しません.