JavaScript基礎の8(functionsと閉鎖)

5475 ワード

1.functionの呼び出しには、①普通関数呼び出し②方法としての呼び出し(関数を対象とする属性が方法となる)③コンストラクターコール④call、appyメソッドを呼び出します.
2.thisはjavascriptのキーワードで、thisは機能領域がなく、呼び出しの関数と関係があります.または、厳格なモードでundefinedができます.ネストの関数thisは外部関数を指しません.次のコード:
    var o = { //        o
        m: function() { //    m        
            var self = this; //   this  ,  this    o
            console.log(this); // true
            f(); //          
            function f() { // 
                console.log(this===window); // "false"
                console.log(self); // "true"
            }
        }
    };
    o.m();
ここで注意したいのですが、mの内部でネスト関数f()を呼び出して、thisはwindowを指しています.oではなく、thisは呼び出しと関係があります.ここはwindowを指しています.見ているとwindowの呼び出しのようです.もしwindow.f()に変えたら、ここでWindows.f not definedを間違えます.ここで注意してください.
3.argments.callee:現在実行されているFnctionを指し、匿名関数が再帰的に呼び出される時に使用できます.ES 5の厳格なモードでは使用できません.
    var factorial = function(x) {
        if (x <= 1) return 1;
        return x * arguments.callee(x - 1);
    };
    console.log(factorial(5));//120
4.argments.caller:この属性はもう廃棄されましたので、もう使わないでください.コールを行う関数です.
5.クローズド:関数オブジェクトと関数に含まれる変数のスコープの組み合わせはクローズドです.キーワードは関数オブジェクトとスコープです.技術的に言えば、すべてのjavascript関数は閉鎖されています.ほとんどの関数が呼び出される時に使うのは定義時のスコープなので、あまり注目されません.関数ネストの中に閉じ込めるのはちょっと面白いです.普段は基本的に無視します.関数ネストによって異なる作用領域ができます.クローズドを理解する一番基本的な原則は、関数が実行する時に使用するのが定義時の作用ドメインチェーンです.たとえば:
    var scope = "global scope"; 
    function checkscope() {
        var scope = "local scope"; 
        function f() {
            return scope;
        } 
        return f;
    }
    console.log(checkscope()());//"local scope"
=====================================================
    var scope = "global scope"; 
    function checkscope() {
        var scope = "local scope"; 
        function f() {
            return scope;
        } 
        return f();
    }
    console.log(checkscope());.//"local scope"
上の二つのコードの実行結果は同じです.閉パック中のスコープは定義された時だけ関係があります.関数の中で関数を呼び出すか、それとも関数の外で関数を呼び出すかは関係がありません.関数を呼び出すたびに、新しいオブジェクトを作成して、いくつかのlocalの変数を保存します.これらの変数は呼び出しが必要なときに使います.このオブジェクト(変数バインディングのオブジェクト)は、スコープ内に追加されます.関数が戻ると、このオブジェクトはスコープ内から削除されます.この変数に他の引用がないと、GCになります.ネスト関数が定義されている場合は、ネスト関数を返したり、ネストの関数を属性に格納したりします.このように外部からの引用があります.この入れ子の関数はGCではなく、オブジェクトもGCではありません.
6.クローズドの一例コード
    var uniqueInteger1 = (function() {
        var counter = 0;
        return function() {
            return counter++;
        };

    }());

    var uniqueInteger2 = (function() {
        var counter = 0;
        return {
            count: function() {
                return counter++;
            },
            reset: function() {
                counter = 0;
            }
        };

    }());
クローズドベースの基本を理解すると、語法のスコープ、関数呼び出し時のスコープが使用される関数定義時のスコープです.
7.関数のlength属性:関数が定義されているときに期待するパラメータの個数(括弧内のパラメータの個数)を表します.
8.bind方法:関数をオブジェクトに結びつけると、関数のthis指向を変えて、bind方法は新しい関数を返します.コードの説明は以下の通りです.
    function f(y, z) {
        console.log(this); //Object {x:1}
        return z ? this.x + y + z : this.x + y;
    }

    var o = {
        x: 1
    };

    var g = f.bind(o, 10);//      this  ,       ,         。     y  10

    console.log(g());//
    console.log(g(2));//   z  2
    console.log(g.prototype); //undefined bind       prototype  
9.関数の定義方式new Function()とfunctionキーワード.new Functionによって構成された関数は、語法のスコープによらず、大域的である.なるべく使わないようにします
    var fn1=new Function('x','y','return x+y;');
    function fn2(x,y){return x+y;}//fn1 fn2  

    console.log(fn1(1,2));
    console.log(fn2(1,2));
10.高次関数:関数をパラメータとして返します.