Closure

1986 ワード

A closure is the combination of a function bundled together(enclosed) with references to its surrounding state (the lexical environment).
MDNの定義
内部関数+語彙環境の組合せ
コンテキストAで宣言された変数を内部関数Bで参照する場合に発生する特殊な状況
var outer = function() {
	var a = 1;
    var inner = function(){
    	console.log(++a);
    }
	inner();
}
outer();
var outer = function(){
	var a = 1;
    var inner = function(){
    	return ++a;
    }
    return inner;
}
var outer2 = outer();
console.log(outer2());
console.log(outer2());





コンテキストAで宣言された変数aの内部関数Bを参照する.
Aの外部に渡せば、Aが終わってもAは消えない.
=>関数が終了しても消えない領域変数を作成できます.
function user (_name){
	var _logged = true;
    return {
    	get name() { return _name;}
        set name(v) { _name = v;}
        login() {_logged = true;}
        logout() {_looged = false;}
        get status(){
        	return _logged ? 'login' : 'logout';
        }
    }
}

var roy = user('yoonji');
console.log(roy.name); //yoonji; getter 호출
roy.name = 'jinyoung'; //setter 호출
console.log(roy.name);//jinyoung
roy._name = 'yooji';
console.log(roy.name);//jinyoung
roy.logout();
console.log(roy.status);// logout
roy.status = true; //setter가 없어서 무시.
console.log(roy.status);//logout
変数
  • は、関数の終了後も変わらない
  • パッケージ内部変数保護