##コールバックとは
###概要
プログラム中で、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数。呼び出し先の関数の引数としてコールバック関数への参照情報を渡すことで、呼び出し先から任意のコールバック関数を実行させ、コールバック関数に実行制御を移すことができる。電話を相手に一度かけて電話番号のみを伝え、いったん電話を切って折り返し相手からかけなおしてもらう様子(これを「コールバック」という)に似ているためこの名前がついた。コールバック関数は、呼び出し先で何らかのイベントが発生した場合の処理を指定する目的で使われることが多い。コールバック関数を使うと、イベントの発生を検知するための処理と、そのイベントが起こった時に実行すべき個々の処理を分離して記述することができる。
###自分の理解
関数Bのポインタはパラメーターとして、関数Aに渡します。関数Aは動いている時、そのポインタを利用して、関数Bを呼び出します。このような状況に、関すBはコールバックというものです。
例えば:
$("button").click(function(){
$("p").hide("slow",function(){
alert("The paragraph is now hidden");
});
});
この中、function(){alert("The paragraph is now hidden");}はコールバック関数です。
##クロージャーとは
###概要
典型的にはクロージャは、外側の関数(以下、エンクロージャ)の内側の関数リテラルや、ネストした関数定義によって必要になる。言語により、そのような内側の関数内に出現する自由変数(内側の関数の仮引数でもなく、内側の関数自身のローカル変数でもない変数)の扱いは異なるが、自由変数が、その呼び出しにおけるエンクロージャのその名前の変数を、レキシカルに参照するのがクロージャであり、実行時に外部の関数が実行された際、クロージャが形成される。クロージャは内部の関数のコードとエンクロージャのスコープ内の必要なすべての変数への参照からなる。
クロージャはプログラム内で環境を共有するための仕組みである。レキシカル変数はグローバルな名前空間を占有しないという点でグローバル変数とは異なっている。またオブジェクトのインスタンス変数とは、オブジェクトのインスタンスではなく関数の呼び出しに束縛されているという点で異なる。
###自分の理解
クロージャは外側と内側関数があり、外側関数return参数後、クロージャの変量はまたいる。でも、クロージャ内の関数の変量はもうなっかた。
例えば:
#####例1
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
結果は:
0
1
この変量iはクロージャの中使う、またあります。クロージャは中の関数と外の間に橋を作って連絡できるになります。
#####例2
var nAdd;
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000