計算問題
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);