JavaScriptのクローズド関数とその役割


一、知っています
ケース:
ページには5つのliラベルがあります.ラベルは0から4までの5つの数字を表示しています.違うラベルをクリックしてコンソールでラベルの索引を印刷します.
主要コード:
	 
  • 0
  • 1
  • 2
  • 3
  • 4
var liList=document.getElementsByTagName("li"); for(var i=0;i<liList.length;i++){ liList[i].onclick=function(){ console.log(i); } }
主な説明:
もしあなたならこのように書きますか?
このように書くと、運転したら、そのラベルをクリックしても印刷されるのは全部数字の「5」です.クリック操作を実行している間、forサイクルはすでに完了しており、i値は「5」です.どのようにすれば毎回循環する時、iはシステムによって回収されないように保存する価値がありますか?閉めろ
コードの変更:
         
  • 0
  • 1
  • 2
  • 3
  • 4
var liList=document.getElementsByTagName("li"); for(var i=0;i<liList.length;i++){ liList[i].onclick=(function(j){ return function(){ console.log(j); } })(i); }
コードの説明:
二つの関数がネストされると、内部関数は外部関数の変数またはパラメータを使ってクローズドされます.クローズドを作成すると、内部関数の変数は対応する関数メモリに保存されます.上のコードのように内部関数変数はすぐに消去されません.
二、クローズドの定義
1.関数ネスト関数
2.内層関数アクセス外層関数変数またはパラメータを呼び出す(パラメータまたは変数をメモリに長く保存する)
三、閉包の役割
1.公有変数を実現する(関数アキュムレータ) 
function add(){
		var num = 0;
		function a(){
			console.log( ++ num);
		}
		return a;
	}
	var myadd = add();
	myadd();//   1
	myadd();//   2
	myadd();//   3
2.キャッシュ(記憶構造)ができます.   3.パッケージ、属性の私有化(私有化変数)が可能です.  
function Deng(name,wife){
	var prepareWife = "xiaozhang";
	this.name = name;
	this.wife = wife;
	this.divorce = function(){
		this.wife = prepareWife;
	}
	this.changePrepareWife = function(target){
		prepareWife = target;
	}
	this.sayPrepareWife = function(){
		console.log(prepareWife);
	}
}
	var deng = new Deng('deng','xiaoliu');