JS関数式+

6137 ワード

ブロックレベルのスコープを模倣する
Javascriptは、ブロックレベルのスコープがなく、ブロックステートメントで定義された変数は、実際にはステートメントではなく関数に含まれて作成されます.
function outputNumbers(count){
   for(var i=0;i
Javascriptでは、変数iはoutput Numbers()の活動対象として定義されているので、定義があるときから関数の随行者にアクセスすることができます.同じ変数を間違って再宣言しても、その値は変わりません.
function outputNumbers(count){
   for(var i=0;i
Javascriptは、後のステートメントに対してのみ無視される変数を示すことができます.匿名関数は、ブロックレベルの役割領域を模倣してこの問題を回避することができます.
(function(){
   //     
})();
匿名関数を指定して直ちに呼び出します.関数宣言はペアの括弧に含まれています.これは実際に関数式です.後の括弧表現は直ちにこの関数を呼び出します.
var tFunction = function(){
   //     
}
tFunction();
まず関数を定義してから呼び出します.関数定義は匿名関数を作成し、tFunctionに値を割り当てます.
function outputNumbers(count){
   (function(){
       for(var i=0;i
上のコードはforループの外部にプライベートスコープを挿入し、匿名関数で定義された任意の変数は実行終了時に破棄されます.したがって、iはループでしか使用できないが、匿名関数がcountにアクセスするのは、匿名関数が閉じられているためであり、作用領域を含むすべての変数にアクセスすることができる.この技術は一般に大域的作用領域に過剰な変数と関数を追加することを制限するために用いられる.一つの大きなアプリケーションでは、多すぎるグローバル変数と関数は名前の衝突をもたらしやすく、作成は有効領域であり、大域的な作用領域を混乱させる心配がない.このような方法は、匿名関数への参照がないので、クローズドメモリの占有を減らすため、実行が完了したら、そのスコープを破壊します.
プライベート変数
Javascriptにはプライベートメンバーの概念がない.すべてのオブジェクトの属性は共有されます.しかし、私有変数の概念があります.どの関数の変数もプライベート変数です.関数の外部にはアクセスできません.は、変数が関数を含むパラメータ、局所変数個、および内部定義の他の関数です.
function add(num1,num2){
   var sum = num1 + num2;
   return sum;
}
関数内部ではnum 1,num 2,sumにアクセスできます.外部ではアクセスできません.これらの変数は、関数の内部にクローズドパケットを作成すると、自分の作用するドメインチェーンを介してアクセスできます.このようにしてプライベート変数にアクセスする公有方法を作成することができます.この方法は特権の方法と言われています.
function MyObject(){
   var privateVariable = 10;
   fucntion privateFunction(){
      return false;
   }
   //    
   this.publicMethod = function (){
      privateVariable++;
      return privateFunction();
   };
}
MyObjectのインスタンスを作成した後は、publicMethod()を使用して、prvateVarableとprvateFunct()にアクセスするしかありません.構造関数を呼び出すたびに、異なるプライベート変数を作成し、特権方法を再作成します.(静的私有変数を使用して特権を実現する方法はこの問題を避けることができる)
静的プライベート変数
プライベートスコープにプライベート変数や関数を定義することによって、特権的な方法を作成することもできます.
(function(){
   //         
   var privateVariable = 10;
   function privateFunction(){
      return false;
   }
   //    
   MyObject = function(){
   };
   //  /    
   MyObject.prototype.publicMethod = function(){
      privateVariable++;
      return privateVariable();
   };
})();
プライベートスコープを作成します.私有作用領域では、まず私有変数と私有関数を定義し、その後、構造関数とその共有方法を定義する.公有法は原型で定義されている.関数宣言は局所関数のみを作成するため、同様にvarキーを使用しません(初期化された変数は大域変数を作成します).コンストラクタは関数式を使用します.したがって、MyObjectはグローバル変数となり、作用領域以外にアクセスすることができます.特権的な方法はプロトタイプで定義されているので、すべてのインスタンスは同じ関数を使用します.特権的な方法は閉鎖的なものとして、いつも役割領域を含む引用が保存されています.
(function(){
   var name = "";
   Person = function(value){
      name=value;
   };
   Person.prototype.getName = function(){
      return name;
   }
   Person.prototype.setName = function(value){
      name = value;
   };
})();
var person1 = new Person("Nicholas");
alert(person1.getName());//"Nicholas";
person1.setName("Greg");
alert(person1.getName());//"Greg";

var person2 = new Person("Michael");
alert(person1.getName());//"Michael";
alert(person2.getName());//"Michael";
一例でsetName()を呼び出すと、すべてのインスタンスに影響を与えます.setNameを呼び出しても、新しいPersonのインスタンスを作っても、name属性に新しい値を与えます.その結果、すべてのインスタンスが同じ値を返します.このように、プロトタイプを使用することによってコード多重化が強化されるが、各インスタンスには、自分のプライベート変数がなく、どのように使用するかは状況に応じて決定される.作用するドメインチェーンの1つの階層を多く検索すると、検索速度に影響を与えます.これはクローズドとプライベート変数を使うには足りないところです.
モジュールモード
一例でプライベート変数と特権方法を作成します.単一の例はインスタンスのオブジェクトです.Javascriptは対象の字面量で単例オブジェクトを作成します.
var singleton = {
   name : value,
   method : function(){
      //    
   } 
};
モジュールモードは、一例のプライベート変数と特権を追加することによって、強化されます.
var singleton = function(){
   //         
   var privateVariable = 10;
   function privateFunction(){
      return false;
   }
   //  /       
   return{
      publicProperty : true,
      publicMethod : function(){
         privateVariable++;
         return privateFunction();
      }
   };
}();
このモジュールモードは、オブジェクトに戻る匿名関数を使用します.匿名関数の内部では、まずプライベート変数と関数を定義します.そして、オブジェクトの字面量を関数として返します.返したオブジェクトの字面量には、開示できる属性と方法が含まれています.オブジェクトは匿名関数の内部で定義されているので、プライベート変数と関数にアクセスする権利があります.このモードは、1つの例を特定の初期化するために使用され、プライベート変数を維持する必要があるときに非常に有用である.
var application = function(){
   //         
   var components = new Array();
   //   
   components.push(new BaseComponent());
   //  
   return{
      getComponentCount : function(){
         return components.length;
      },
      registerComponent : function(component){
         if(typeof component == "object"){
            components.push(component);
         }
      }
   };
}();
この簡単な例は、コンポーネントを管理するためのアプリオブジェクトを作成する.このオブジェクトを作成する過程で、最初にプライベートなcomponents配列を宣言し、BaseComponentの新しいインスタンスを配列に追加して戻ってきたオブジェクトget ComponentCountは、登録されたコンポーネントの数を返します.このようなモードで作成された各単例は、最終的にオブジェクトの字面量によって表されるため、Objectの例である.
強化モジュールモード
オブジェクトに戻る前に、エンハンスメントされたコードを追加します.このようなモードは、それらの一例に適合しています.いくつかの属性と方法を追加して、強化しなければならない場合があります.
var singleton = function(){
   //         
   var privateVariable = 10;
   function privateFunction(){
      return false;
   }
   //    
   var object = new CustomType();
   //    /       
   object.publicProperty = true;
   object.publicMethod = function(){
      privateVariable++;
      return privateFunction();
   };
   //      
   return object;
}();
例では、appicationオブジェクトは、BaseComponentの例でなければならないので、以下のコードが使えます.
var application function(){
   //       
   var components = new Array();
   //   
   components.push(new BaseComponent());
   //  application       
   var app = new BaseCponent();
   //    
   app.getComponentCount = function(){
      return components.length;
   };
   app.registerComponent = function(component){
      if(typeof component == "object"){
         components.push(component);
      }
   };
   return app;
}();
最初にプライベート変数を定義します.appはBaseComponentの例でなければならないので、実際にはappliationオブジェクトのローカル変数版であり、その後、プライベート変数にアクセスできる共有方法をappオブジェクトに追加し、最後にappオブジェクトに戻り、グローバル変数applicationに値を付けます.