JavaScript上級プログラム設計学習ノート——引用タイプ2 Functionタイプ(重要)

5505 ワード

関数は、Functionタイプの例であるため、関数もオブジェクトであり、そのように関数も方法を有し、その挙動を向上させるために使用され得る.(この点はJSの一番特色があるところです)
関数名は、実際には関数オブジェクトを指すポインタであり、関数と結合されません.
一、関数の定義
  • 関数宣言文法:
  •         function sum(num 1,num 2){
                return num 1+num 2
            }//括弧を持たない関数名を使用すると、関数ポインタにアクセスします.呼び出し関数ではありません.
  • 関数式:
  •         var sum=function(num 1,num 2){
                return num 1+num 2
            };//注意:関数の末尾にはセミコロンがあります.他の変数を宣言するように、変数sumで関数を呼び出すことができます.
  • Function構成関数:
  •         var sum=new Function(“num 1”、“num 2”、“ return num 1+num 2")//不推薦;前はパラメータ、最後は関数体です.
            同じ名前の関数が複数宣言されている場合、後ろの関数は前の関数をカバーし、重い負荷が発生しませんでした.主にECMAScriptは関数の署名がないからです.
           関数宣言と関数表現を区別します.解析器は関数宣言を優先的に読み取り、コードを実行する前に利用可能にします.;関数表現は、解像度がそのコードの行才に実行されるまで待たなければなりません.変数のアクセス関数という点で区別できるのはいつですか?関数宣言の形式で関数を定義すると、呼び出し文を関数宣言の前に書くことができますが、後者はエラーを報告します.
            関数名自体は変数ですので、関数は値として使用できます.一つの関数をパラメータとして別の関数に渡すこともできます.関数はパラメータとして括弧を入れてはいけません.
    二、関数の内部属性
            関数の内部には2つの特殊なオブジェクトがあります.
  • アーグメンントは、着信関数のすべてのパラメータを含むクラスのオブジェクトです.オブジェクトにはcaleeという属性があり、このアーグメンツオブジェクトを持つ関数を指すポインタです.
    function factorial(num){//    
    
            if(num <=1){
    
            return 1;
    
            }else {
    
                return num * arguments.callee(num-1);//               ;
    
            }
    
    }
  •  thisは、関数を参照して実行する環境オブジェクトです.
  • window.color = "red";
    
            var o = { color: "blue" };
    
            function sayColor(){
    
                alert(this.color);
    
            }
    
            sayColor();     //red
    
            o.sayColor = sayColor;
    
            o.sayColor();   //blue
  • ECMAScript 5は、別の関数オブジェクトの属性を規定しています.この属性には、現在の関数を呼び出す関数参照が保存されています.グローバルスコープで現在の関数を呼び出すと、その値はnullです.
    function outer(){
    
                inner();
    
            }
    
            function inner(){
    
                alert(arguments.callee.caller);
    
            }
    
            outer();//    outer()      ,    ,      caller    ,      
    三、関数の属性と方法
            関数はオブジェクトですので、属性と方法もあります.各関数は2つの属性を含みます.lengthとprototype.
  • length属性は、関数が受信したい名前付きパラメータの個数を表し、
  • prototype属性の場合、この属性は列挙できないので、for-iでは実現できません.tostring()、valueOf()などの方法はすべてprototypeの名前に保存されています.それぞれのオブジェクトのインスタンスを通じてアクセスするだけです.
  •         各関数は、2つの非継承的な方法をさらに含む.
  • の両方の用途はいずれも特定の作用領域で関数を呼び出すものであり、実際には関数の内部にあるthisオブジェクトの値に等しい.
  • appy()は、2つのパラメータを受信する.ここで、動作関数の作用領域、もう1つはパラメータ配列、
  • call()は、2つのパラメータを受信する.ここで、動作関数の機能領域、もう1つは、関数に伝達されるパラメータのリスト、
  • .
  • の最も強力な用途は、関数頼を拡張して動作させることができるスコープであり、オブジェクトは、方法との結合関係を必要としない:
  • window.color = "red";
    
            var o = { color: "blue" };
    
            function sayColor(){
    
                alert(this.color);
    
            }
    
            sayColor();            //red
    
            sayColor.call(this);   //red
    
            sayColor.call(window); //red
    
            sayColor.call(o);      //blue
  • bit()は、ECMAScript 5で定義され、関数の一例を作成し、そのthis値は、bind()関数に渡す値
  • に結び付けられる.
    window.color = "red";
    
            var o = { color: "blue" };
    
            function sayColor(){
    
                alert(this.color);
    
            }
    
            var objectSayColor = sayColor.bind(o);
    
            objectSayColor();   //blue
    四、関数の戻り値
  • 関数が確かに値を持っていても、明示的にそれを宣言する必要はありません.この関数は、return演算子の後に戻る値を使うだけでいいです.
  • はJavaと同じで、関数はreturn文を実行した後、直ちにコードを停止します.したがって、return文の後のコードは実行されません.
  • 関数に戻り値がない場合、パラメータなしのreturn演算子を呼び出して、関数をいつでも終了します.本当に戻り値はundefinedです.
  • 五、関数の実行
           (function(){…}()と(function(){…}()はすぐに関数を実行する2つのjavascriptの一般的な書き方です.
           匿名関数は、シナリオ全体に一度だけ出現する関数を定義するのに適しています.匿名関数には名前がなく、どこでしか定義できません.どこで使用できますか?
  • 方式1では、関数を呼び出して戻り値を求めます.強制演算子は、関数呼び出しを実行させます.
  • (function(x,y){
    
        alert(x+y);
    
        returnx+y;
    
    }(3,4));
  • 方式2では、関数を呼び出して戻り値を求めます.強制関数の直接量を実行し、参照を返してから実行
  • を呼び出します.
    (function(x,y){
    
        alert(x+y);
    
        returnx+y;
    
    })(3,4);
    このような方法も多くのライブラリの愛用されています.例えば、jQuery、Mootools.
  • 方式3は、void
  • を使用する.
    void function(x) {
    
          x = x-1;
    
          alert(x);
    
    }(9);
  • 方式4、−/+演算子
  • を使用する.
    -function(x,y){
    
        alert(x+y);
    
        returnx+y;
    
    }(3,4);
    
    +function(x,y){
    
        alert(x+y);
    
        returnx+y;
    
    }(3,4);
    
    --function(x,y){
    
        alert(x+y);
    
        returnx+y;
    
    }(3,4);
    
    ++function(x,y){
    
        alert(x+y);
    
        returnx+y;
    
    }(3,4);
  • 方式5で、ウェーブ記号(~)を使用します.
    ~function(x, y) {
    
        alert(x+y);
    
       returnx+y;
    
    }(3, 4);
  • 方式6において、匿名関数が、中かっこ内に置く
  • を実行する.
    [function(){
    
       console.log(this) //          window
    
    }(this)]
  •  方式7で、匿名関数の前にtypeof
  • を追加します.
    typeoffunction(){
    
       console.log(this) //          window
    
    }(this)
  • 方式8、匿名関数の前にdelete
  • を追加する.
    deletefunction(){
    
       console.log(this) //          window
    
    }(this)
  • 方式9、匿名関数の前にvoid
  • を追加します.
    void function(){
    
       console.log(this) //          window
    
    }(this)
  • 方式10、new方式を使用して、
  • を参照してください.
    newfunction(win){
    
       console.log(win) // window
    
    }(this)
  • 方式11、newを使って、
  • を伝えません.
    newfunction(){
    
        console.log(this) //    this   window 
    
    }
  • 方式12,コンマ演算子
  • 1, function(){
    
        console.log(this) // window
    
    }();
  • 方式13、ビット別または演算子
  • による.
    1^function(){
    
        console.log(this) // window
    
    }();
  • 方式14、比較演算子
  • 1>function(){
    
        console.log(this) // window
    
    }();
    最後にエラーの呼び出し方法を見てください.
    function(x,y){
    
        alert(x+y);
    
        returnx+y;
    
    }(3,4);