js関数、prototype属性、作用域のポイントをまとめます.


javascriptの対象向け基礎技術のコラムを読みました.その中の重要な間違えやすい知識点をまとめます.
 
関数:作成関数:1、function f(x){….}2、var f=function(x){...}上の2つの形式はいずれもf()という関数を作成できます.後の形式で匿名関数定義を作成する場合はパラメータを設定できます.関数に伝えるパラメータの個数が足りない場合は、一番左から順に対応します.残りはundefinedで割り当てられます.関数に伝えるパラメータが関数定義パラメータの数より多い場合、多くのパラメータは無視されます.1つの方法で定義された関数とは異なり、関数に対する呼び出しはその前に可能ですが、2つの方法で関数に対する呼び出しは関数定義後に必ず発生します.
 
関数のprototype属性を説明します.まず、各関数にプロトタイプ属性が含まれています.この属性はプロトタイプオブジェクトを指します.
function Person(name,sex) {  //Person      
        this.name = name;  
        this.sex = sex;  
    }  
   Person.prototype.age = 12;   // Person  prototype     prototype       ,  
                                                   //    Person          
   Person.prototype.print = function() { // Person        
       alert(this.name+"_"+this.sex+"_"+this.age);  
   };  
  var p1 = new Person("name1","male"); //p1 age     Person    ( prototype  ) 
   var p2 = new Person("name2","male");  
   p1.print();  //name1_male_12 
   p2.print();  //name2_male_12 
   p1.age = 34; //  p1   age    
  p1.print();  //name1_male_34  
  p2.print();  //name2_male_12  
  Person.prototype.age = 22;  //  Person     age    
  p1.print();  //name1_male_34(p1 age       prototype        )  
  p2.print();  //name2_male_22(p2 age       )  
  p1.print = function() {  //  p1   print    
        alert("i am p1");  
   }  
   p1.print();  //i am p1(p1        )  
   p2.print();  //name2_male_22(p2        )  

   Person.prototype.print = function() { //  Person   print    
      alert("new print method!");  
   }  

   p1.print();  //i am p1(p1 print          )  
   p2.print();  //new print method!(p2 print              )
JSでは、newオペレータでクラスのインスタンスオブジェクトを作成した後、その方法と属性は確かにクラスのprototype属性を継承しています.クラスのprototype属性で定義された方法と属性は、これらのインスタンスオブジェクトに直接参照されます.しかし、これらのインスタンスオブジェクトの属性と方法について値または定義を再作成した後、例示的なオブジェクトの属性または方法は、もはやクラスのプロトタイプ属性で定義された属性および方法を指すものではない.このとき、クラスのプロトタイプ属性に対応する方法または属性を変更しても、インスタンスオブジェクトには反応しない.これは、上記の例を説明する.最初に、newオペレータで2つのオブジェクトp 1,p 2を生成した.彼らのage属性およびprint方法は、(継承)から来ている.Personクラスのprototype属性を修正しました.そして、p 1のage属性を修正しました.後はPerson類のprototype属性の中のageに対して値を再割り当てしました.p 1のage属性はこれによって変わりませんが、p 2のage属性は変わりました.p 2のage属性はやはりPerson類のprototype属性から派生しているので、同じ場合は後のprint方法にも反映されています.
 
スコープ:
 
var sco = "global";  //      
  function t() { 
       var sco = "local";  //           
       alert(sco);         //local          
  }  
  t();             //local  
  alert(sco);      //global              
javascriptにはブロックレベルのスコープがありません.つまり、javaまたはc/c++の中で一つのブロックを「{}」で囲むことができます.したがって、ブロック内の局所変数を定義します.「{}」ブロックの外では、これらの変数はもう機能しません.同時に、forループなどの制御語句の中で局所変数を定義することもできますが、javascriptにはありません.
 
function f(props) {  
        for(var i=0; i<10; i++) {}  
        alert(i);         //10    i   for        ,      
                         //              .  
       if(props == "local") {  
            var sco = "local";  
        alert(sco);   
        }  
        alert(sco);       //  ,      if          
   }  
   f("local");      //10  local   local
関数内部でローカル変数を定義する時は特に注意してください.
 
var sco = "global";  
 function print1() {  
    alert(sco);   //global  
 }  
 function print2() {  
     var sco = "local";  
     alert(sco);   //local  
 }  
 function print3() {  
     alert(sco);   //undefined  
     var sco = "local";   
     alert(sco);   local  
 }  
   
 print1();  //global  
 print2();  //local  
 print3();  //undefined  local
最初のalert文は大域変数「global」を表示していません.undefinedです.これはprint 3関数でsco局所変数を定義しています.大域のsco属性は関数の内部では機能しません.この例から、関数の内部で局所変数を定義する場合、エラーがないように最初に必要な変数を定義したほうがいいです.
 
 
以上はすべてjs基礎シリーズを見終わった後の総括です.具体的には参照できます.http://www.iteye.com/wiki/Object_Oriented_JavaScript