計算問題
var i = 20;
function fn() {
 i -= 2;
 var i = 10;
 return function (n) {
 console.log((++i) - n);
 }
}
var f = fn();
f(1);//10
f(2);//10
fn()(3);//8
fn()(4);//7
f(5);//9
console.log(i);//20

計算問題
var n = 0;
function a() {
	var n = 10;
	function b() {
		n++;
		console.log(n);//=>11
	}
	b();
	return b;
}
var c = a();
c();//=>12
console.log(n); //=>0

計算問題
 let x = 5;
function fn(x) {//x:6
	// プライベート・コンテキストはプライベート変数xを持つ
 return function(y) {//7 8 10
		// ここでのxはすべてECでのxである。
 console.log(y + (++x));
 }
}
let f = fn(6);
f(7);//14
fn(8)(9);//8 18
f(10);//18
console.log(x); //5

計算問題
 let x = 5;
function fn() { 
	// プライベート・コンテキストにxはない
 return function(y) {
		// ここでxはECのxである
 console.log(y + (++x));
 }
}
let f = fn(6);
f(7);//13
fn(8)(9);//16
f(10);//18
console.log(x);//8

計算問題
 let a = 0,
 b = 0;
function A(a) {
	A = function (b) {
		alert(a + b++);
	}//=>Aの最初の実行では、グローバルなA関数を内部の新しい小さい関数に再割り当てし、その後のAの実行では,
小関数は代入後に実行される(ここでは小関数はプライベートコンテキストにあるが、外部Aにも占有されている)。,
(文脈が壊れないようにするためだ)
	alert(a++);
}
A(1);//"1"
A(2); //"4"

計算問題
var test = (function (i) {
return function () {
alert(i *= 2); //="4"
}; 
})(2);
test(5);
/* 
* EC(G)グローバルな方向性
* var test;
*/
// test = 自己実行関数の実行結果の返り値をテストに代入する
// = BBBFFF000; ((小さな関数が返される)
var test = (function (i) {
/*
 * 自己実行関数 EC=>リリースしない
 * i = 2 (4)
 * スコープ・チェイニング<EC(AN),EC(G)>
 * 形式的パラメータ割り当て
 * 可変ブースティング
 */
return function () {
/*
* プライベート・コンテキストEC
* 
* スコープ・チェイニング<EC(TEST),EC(AN)>
* 初期化 論点= { 0:5,length:1 }
* 形式的パラメータ割り当て
* 可変ブースティング
*/
alert(i *= 2); //=>i=i*2 iは上位のコンテキストにあるEC
}; //=>return BBBFFF000;
})(2);
test(5);