javascript対象技術基礎(三)


関数javascript関数はみんながたくさん書いたと信じていますので、ここでは簡単に紹介します.関数を作成します.function f(x){…}var f=function(x){}上の2つの形式はいずれもf()という関数を作成できます.後の形式では匿名関数定義を作成する時にパラメータを設定できます.関数に渡すパラメータの数が足りない場合は、関数の数を指定できます.一番左から順に対応して、残りはundefinedで値を割り当てます.関数に伝えるパラメータが関数定義パラメータの数より多い場合、多くのパラメータは無視されます.
 
function myprint(s1,s2,s3) {
    alert(s1+"_"+s2+"_"+s3);
}
myprint();      //undefined_undefined_undefined
myprint("string1","string2"); //string1_string2_undefined
myprint("string1","string2","string3","string4"); //string1_string2_string3
 
したがって、定義された関数については、すべてのパラメータをコーディネーターが転送することは期待できません.必要なパラメータについては、関数体で検出するか、またはデフォルト値を設定してパラメータと動作してパラメータを取得します.
 
function myprint(s1,person) {
    var defaultperson = {   //  person  
        "name":"name1",
	"age":18,
	"sex":"female"
    };
    if(!s1) {    //s1     
        alert("s1 must be input!");
	return false;
    }
    person = person || defaultperson;  //  person    
    alert(s1+"_"+person.name+":"+person.age+":"+person.sex);
};

myprint(); //s1 must be input!
myprint("s1"); //s1_name1:18:female
myprint("s1",{"name":"sdcyst","age":23,"sex":"male"});  //s1_sdcyst:23:male
 
関数のargments属性はそれぞれの関数体の内部にあるアーグメンツ識別子であり、この識別子はアーグメンツオブジェクトを表しています.アーグメンツオブジェクトは非常にAray(配列)オブジェクトと似ています.例えば、length属性があります.アクセスする値はインデックスでパラメータ値にアクセスしますが、両者は全く違っています.表面上の共通点だけです.(例えば、Agmentsオブジェクトのlength属性を変更すると、その長さは変わりません).
 
function myargs() {
    alert(arguments.length);
    alert(arguments[0]);
}
myargs();   //0  ---  undefined
myargs("1",[1,2]);  //2 --- 1
 AgmentsオブジェクトにはカレントAgmentsオブジェクトがある方法を示すcalee属性があります.匿名関数の内部再帰的呼び出しを実現するために使用できます.
function(x) {
    if (x <= 1) return 1;
    return x * arguments.callee(x-1);
}  (section8.2)
 ------------------------------------------------------------------
Method--方法は関数です.各オブジェクトには0つ以上の属性が含まれています.属性は任意のタイプであってもいいです.もちろん、対象も含まれています.関数自体はオブジェクトですので、一つの関数を一つのオブジェクトに入れることができます.この関数はオブジェクトの一つの方法になります.その後、この方法を使うなら、オブジェクト名で「.」を利用できます.オペレータが実現する
var obj = {f0:function(){alert("f0");}}; //        
function f1() {alert("f1");}
obj.f1 = f1;    //       

obj.f0(); //f0  f0 obj   
obj.f1(); //f1  f1 obj   
f1();     //f1  f1        ,      
f0();     //f0   obj   ,         
 
メソッドの呼び出しにはオブジェクトのサポートが必要ですが、オブジェクトの属性はどのように取得できますか?
 
var obj = {"name":"NAME","sex":"female"};
obj.print = function() {  //       
    alert(this.name + "_" + this["sex"]);
};
obj.print();  //NAME_female
obj.sex = "male";
obj.print();  //NAME_male
 
次はもっと対象に向かう例を示します.
var person = {name:"defaultname",
              setName:function(s){
	          this.name = s;
	      },
	      "printName":function(){
	          alert(this.name);
	      }}
person.printName();       //defaultname
person.setName("newName");
person.printName();       //newName
 
上記の例では、person.name=.を用いて直接的にpersonのname属性を変えることができます.ここでは先ほど述べた内容を示すためだけに、person属性を変更する方法として、一つのfunctionを定義し、二つのパラメータを受信します.一つはpersonで、一つはnameの値です.どちらの方法がいいですか?例の方法がよりイメージ的で、より直感的です.そして、オブジェクトに向かって影があるようです.もう一度強調してみます.方法自体が関数です.ただし、方法の使用はより制限されています.関数の場合は、上記の内容は同じ方法に適用されます.逆に、関数のprototype属性は各関数に一つのプロトタイプの属性が含まれています.この属性はjavascriptの対象に向けた核心的な基礎を構成しています.後で詳細に検討します.