Js整理備忘録(05)——関数基礎(一)

9692 ワード

概念:関数は、「実行可能なコードを有するオブジェクト」と簡単に定義できます.
  • は、具体的には、関数は一回を定義しているが、Javascript(以下、Jsという)コードのうちの任意の回数を呼び出したり、実行したりすることができる.
  • 関数は、演算に参加して得られた関数の戻り値、戻り値を関数呼出式の値として指定します.
  • オブジェクト内部で定義された関数は、メソッドと呼ばれ、オブジェクトは、メソッドを呼び出すときにも、方法の一つの隠蔽パラメータとして使用される.
  • タイプ:1つの関数をtypeof()演算し、戻るタイプはfunctionです.
  • ですが、関数の定義では、「関数は…の対象」とはどういうことですか?えっと、これはJavascript言語のゆったりした特性としか言えません.また、配列とオブジェクトの関係よりも関数とオブジェクトの関係が複雑で微妙で、ゆっくりと感じていく必要があります.関数とオブジェクトの微妙な関係を一編で説明する予定です.
  • 特徴:
  • 関数の最も重要な特徴は、呼び出し可能であることである.
  • は、関数を定義する際に固定数のパラメータを指定することができますが、呼び出しを行うと、任意の数の実際のパラメータを伝えることができます.
  •  
    1、関数の作成(定義)
    (1)関数の直接量
    ——関数の直接量は、通常は匿名関数として定義され、変数に直接与えられたり、関数のパラメータとして直接使用されたりします.たとえば:
    var f=function(x){return x*x;}//全体は語句です.「=」の右側の表現は関数の直接量です.
    もちろん、関数の直接量に関数名を指定することもできます.
    var f=function fn(x){return x;}//このような定義は全く問題ない.
     
    (2)function文
    ——単に関数を定義するだけです.
    たとえば:
    function print(msg) {
    
        document.write(msg+"<br/>");
    
    }
    この関数の名前は「print」で、引数msgがあります.関数体にはreturn文がありません.つまり、戻り値がない、あるいは「undefined」を返します.
    呼び出し時、直接print(「hello」)と書くことができます.
    もう一つの例を見ます
    function distance(x1, y1, x2, y2) {
    
        var dx = x2 - x1;
    
        var dy = y2 - y1;
    
        return Math.sqrt(dx * dx + dy * dy);
    
    }
    この関数は2点間の距離を計算し、計算後の数値を返します.
    このように呼び出すことができます.var d=distance(1,1,4,5)//d=5
     
    (3)Functionオブジェクトを使って関数を作成する
    ——Functionは関数を作成するためのコンストラクタです.Jsの中で重要な概念です.本当に関数を作る場合は多くないですが、概念的にはよく知るべきです.
    使い方:var f=new Function(「x」「y」「return x+y」);この方法は不器用で、本当に関数を作成する時は一般的に使われません.
    function f(x,y){return x+y}に相当します.
     
    2、関数のパラメータ(argments)
    (1)オプションパラメータ
    実際に伝達されるパラメータの数が定義されていない場合、他のパラメータはundefined値である.
    注意:この特性のため、関数を設計する時はオプションのパラメータをパラメータリストの末尾に置くべきです.そうでなければ、明示的にundefinedまたはnull値をパラメータとして伝えることができます.
     
    (2)Agmentsオブジェクト
    本論文の冒頭の特徴にも言及したように、関数の定義にかかわらず、任意の数のパラメータを関数に伝達することは合法的である.この特徴は関数のアーグメンント属性に帰すべきで、これは「行列のようなオブジェクト」を参照します.Agmentsオブジェクトは、すべての実際のパラメータにアクセスすることができます.これらの実際のパラメータには、length属性が実際のパラメータの個数を表します.
    argmentsオブジェクトの存在は興味深い.例えば、可変パラメータ関数を作成することができる.例えば、一連の数字の中の最大値を求めます.数字の数は不確定です.
    常に明確にする:
  • アーgmentsは配列ではなく、Agmentsオブジェクトです.これを、いくつかの符号化属性を持つオブジェクトと見なすのがより適切である.
  • Agmentsにはもう一つの特性があります.argmentsは下付きでこれらのパラメータの値にアクセスできます.パラメータの値も変えられます.
  • function f(x) {
    
        print(x);
    
        arguments[0] = null;    // x       
    
        print(x);               //   null
    
    }
    
    f("hi",123);//    f
    つまり、この関数のargments[0]はパラメータ変数xに相当し、一つの値が変わるともう一つも変わります.
    この特性は,アーグメンントが一般的な意味での配列ではないことも同時に説明した.通常の配列の中の要素が最初に変数の値に等しい場合、その後その要素の値を変更すると変数の値が変わることはないはずです.
  • Agmentsにはもう一つの属性があります.現在実行中の関数を参照します.名前付き関数の再帰的呼び出しを許可するために使用できます.
  •  
    (3)パラメータの種類
    Jsのゆったりした特性のため、関数は宣言時にパラメータの種類を指定する必要がなく、呼び出し時に実際に伝達されるパラメータ値に対してもタイプチェックを行いません.
    関数を定義するときには、パラメータが何らかのタイプであることが望ましい場合があります.このときは、パラメータの中にコメントでタイプを指定して、コードの読み取り可能性を高めることができます.例えば、
    function fn(/*number*/n, /*string*/s /* ,optional...*/) {
    
        /* code here */
    
    }
    関数fnの最初のパラメータはnumberタイプであり、第二のパラメータはstringタイプであるべきであり、残りのパラメータは選択されてもよい.
     
    3、関数の適用
    (1)データとして
    Jsの関数は文法だけではなく、データとしても使用できます.この場合、通常は戻り値を持つ関数を指します.データとしての使用は主に以下の通りです.
  • は、関数を変数に割り当てます.例えば、
  • function square(x) { return x * x; } //       
    
    var a = square(4);                   //    ,        
  • は、オブジェクトの属性、例えば
  • に格納される.
    var o = {}; //                                      
    
    o.square = function(x) { return x * x; };//       square,       ,  square        
    
    y = o.square(4);//       
  • は、配列の要素
  • に記憶されている.
    var a = [];
    
    a[0] = function(x) { return x * x; }//             
    
    a[2] = a[0](12);//    ,a[2]  144
  • は、ある関数
  • にパラメータとして伝達される.
    配列方法sort()を参照することができます.
     
    (2)方法として
    すなわち、(1)でいうオブジェクトの属性に関数を格納する方法です.関数はこのオブジェクトと呼ばれる方法です.
    注意:方法体では、現在のオブジェクト(この方法を呼び出す)をthisキーワードで参照することができます.(言いにくいですが、大事です)
    var cal = {
    
        x: 100,y: 50,
    
        add: function() {
    
            var result = this.x + this.y; //   this       cal   ,          x y
    
            return this.result;
    
        }
    
    };
    関数がオブジェクトとしての方法ではなく関数として呼び出されると、このthisはグローバルオブジェクトを参照します.
     
    (3)コンストラクション関数としてオブジェクトを作成する
    コンストラクタはオブジェクトを作成するための関数です.たとえば:
        function point(x, y) { this.x = x; this.y = y; } //        ,  this               。
    
        var p = new point(2, 3);  //      point,     p,  point  this  p     , p.x=2,p.y=3。
    //   p={x:2,y:3}
    
        var q = new point(-1, -3);//              q,  point  this  q     , q.x=-1,q.y=-3。
    
    //   q={x:-1,y:-3}
    オブジェクト作成プロセスは、new演算子を用いて新しいオブジェクトを作成し、構造関数を呼び出して、新しいオブジェクトをthisキーワードの値として伝達することができるということを理解することができる.
    注意:ここでは必ずnew演算子を使用します.そうでないと、オブジェクトを作成しません.例えば、
    var p=point;関数の参照を他の変数pに割り当てるだけです.つまり、pとpointは関数の参照を表します.
    var p=point(1,1);実行関数に相当するだけで、戻り値は変数pに割り当てられます.このステートメントの実行後pはundefinedです.呼び出し関数pointは戻り値が設定されていません.
    ——対象に向かうと、構造関数の概念が対象言語の「類」に似ていることが分かります.
    ここでは詳しくはなく、関数とオブジェクトの微妙な関係については、構造関数の具体的な使用について説明します.
     
    4、関数の属性と方法
    typeof()演算子が関数に使用されると、文字列「function」を返しますが、関数は本当に特殊なオブジェクトです.
    対象の一つである以上、属性と方法を持つことができる.
    Dateオブジェクトのように、構築関数(自身のタイプはfunction)であり、new演算子と一緒に新しいDateオブジェクトを作成することができ、作成されたオブジェクトのインスタンスのタイプはobjectであり、新規オブジェクトが作成されると、Dateオブジェクトの属性と方法はすべて持ちます.
    (1)属性length
    関数のlength属性は、関数が宣言した形式パラメータの数です.前に述べた関数体の中のargments.lengthは、関数を呼び出した時の実際のパラメータの個数です.
    例えば、以下の関数check()は、現在呼び出されている関数を検出するために使用されてもよく、参照数と等しいかどうか.
    <script language="javascript" type="text/javascript">
    
        function check(args) {
    
            var actual = args.length;           //    
    
            var expected = args.callee.length;  //            
    
            //callee Arguments   ,         ,    Arguments     
    
            if (actual != expected) {
    
                alert("          ,   !");
    
            }
    
        }
    
        //      check()
    
        function f(x, y, z) {
    
            check(arguments); //arguments       
    
            document.write(x + y + z);
    
        }
        //    f() 
    
        f(1, 2);    //<1>     ,       NaN,  z     undefined
    
        f(1, 2, 3); //<2>    ,    6
    
    </script>
     
    (2)属性プロトタイプ
    各関数にはプロトタイプの属性があります.彼はあらかじめ定義されたプロトタイプのオブジェクトを参照します.新しいオブジェクトタイプを定義する際に非常に重要な役割を果たしています.後に詳細な説明が必要です.
     
    (3)方法appy()とcall()
    ——これも面白い方法です.ECMAScript仕様はすべての関数にこの二つの方法を定義しています.
  • この2つの方法は、他のオブジェクトを呼び出す方法のように関数を呼び出すことができる.例えば、2つのパラメータを関数f()に伝え、それをオブジェクトoとする方法で呼び出します.
    f.call(o, 123, "asd");
    o.m = f;        //       o   m, m  o     
    
    o.m(123, "asd");//  o   m
    
    delete o.m;     //    m
     
  • 二つの方法は同じです.ただし、伝え方が違います.
  • .
    例えば、上記の例では、appy()方法を使用すると、呼び出し方式は
    f.apply(o,[123,「asd」)このパラメータは配列に保存されます.
    関数が複数のパラメータを受け入れる必要がある場合、これらのパラメータを1つの配列に置いて、関数のappy方法を呼び出して、1つの配列をパラメータとして渡すことができます.
     
    ——ここに書いておきます.次のセクションでは、関数の基礎(二)と関数の役割領域とクローズドを学ぶ予定です.