第七章関数表現と関数宣言、thisオブジェクトについて、プライベートスコープ(){}()()、プライベート変数と特権方法

6671 ワード

一:関数式と関数宣言
1:関数宣言と関数式の違い
①関数宣言はセミコロンで終わる必要はありません.
②関数宣言は、関数アップの特徴があります.
③関数宣言の後には、Javascriptが関数宣言の開始として機能宣言していますが、関数宣言の後には括弧を付けられません.
 
2:匿名関数の役割
①値として使う
function sum(num1,num2){
      return function(num1,num2){
           return  num1+num2;
    }  
}
 
3:クローズド
 
概念:別の関数のスコープにアクセスする権限を持つ変数の関数です.(一つの関数の内部に別の関数を作成することによって、クローズドされます.)
①関数が呼び出されると、実行環境と対応するスコープチェーンが作成され、アーグメンツと他のネーミングパラメータの値を使って関数のアクティブオブジェクトを初期化します.外部関数の活動対象は,作用分域鎖において次数の位置にある.
function compare(value1,value2){
        if(value<value2){
                return -1;  
}  else if(value1>value2){
                return 1;
}  else {
                return 0;
}
}

//  compare() ,       arguments,value1 value2     。           (  result compare) compare()               。
③バックグラウンドの各実行環境には変数オブジェクトがあります.グローバルオブジェクトは常に存在し、compre関数のような局所環境の変数オブジェクトは、関数実行中にのみ存在します.
フィールドチェーンは、実際に変数オブジェクトを含むものではない変数オブジェクトのポインタリストを指します.
④クローズド———create()関数内部で定義されている匿名関数のスコープには、実際に外部関数create()の活動対象が含まれています.
var create1 = create("name");
var result = carete1({name:"Wang"},{name:"Lee"});

// create
 
関数createが実行された後も、匿名関数のスコープは依然としてこのアクティブオブジェクトを参照しているので、そのアクティブオブジェクトは破棄されません.(ただし、create()を実行した後にcreate()の作用するドメインチェーンは破壊されます)
通過する
create1 = null;
 
匿名関数の作用ドメインチェーンを破棄します.
 
二.thisオブジェクトについて(エラーが発生しやすい)
1:匿名関数の実行環境は大域的であるため、thisオブジェクトは通常windowを指す.ただし、クローズドの書き方のため、明らかではありません.
        var name = "global";

        var object = {
                name : "part",
                getName : function(){
                return function(){
                        return this.name;
                }
            }
        };

        alert(object.getName()());
//global
2:各関数は呼び出し時に自動的に2つの特殊変数を取得します.内部関数は、この2つの変数を検索すると、そのアクティブなオブジェクトだけが検索されますので、外部関数の2つの変数に直接アクセスすることはありません.
   変数にthisを保存する必要があります.
        var name = "The Window";

        var object = {
            name : "My object",
            getName : function(){
                var that = this;
                return function(){
                    return that.name;
                };
            }
        };
    
     alert(object.getName()());
        
     //My object
 
三.プライベートスコープ
プライベートスコープ(ブロックレベルスコープ)として使用されるシンタックスは以下の通りである.
  (function(){

        //        

  })();
この技術は大域作用領域において関数の外部としてしばしば用いられ,大域作用域に過剰な変数と関数の追加を制限する.たとえば
  (function(){

        var now = new Date();
            if(now.getMonth()==0&&now.getDate()==1){
               alert("Happy");
      }    
  })();

//     1 1             
 
 
四.プライベート変数と特権方法 
①プライベート変数:関数内部で定義された変数
②特権方法:プライベート変数とプライベート関数にアクセスする権限がある公開方法を特権方法といいます(クローズドを利用して実現します).
    function PP(name) {
        this.getName : function(){
            return name;
        }
    }

    var ppp = new PP("hehe");
    alert(ppp.getName());
③getName()法でプライベート変数nameにアクセスするが、この書き方には、構造関数モードを使用して行わなければならないという欠点がある.その他の私有変数と特権方法を作成するパターンは本をご覧ください.