クロージャが何であるかを100%確信していないように私には見えます...あなたのコードから始めて:
function A()
{
this.p1=1;//public
var p2=2;//private
this.f1=function()
{
alert(this.p1);
};
this.f2=function()
{
alert(p2);
};
ここではp2
、コンストラクターのスコープに対してローカルな変数として定義しましたが、パブリックメソッドf2
はその値にアクセスし、変更することもできます。それはクロージャです:それ自身の特定のスコープ内に含まれるコード/データ。次のコードで何をしているのか:
this.action=function(param)
{
if (param=='1')
{
return this.f1;
}
return this.f2;
};
}
var v=new A();
v.action("1")();
クロージャとはほとんどまたはまったく関係がなく、関数への参照を返します(この特定のケースではオブジェクトメソッドです)。なぜ、これはpoint
それが由来するオブジェクトではないのですか?単純:
var foo = {name:'someObject'};
foo.retVal = v.action('1');//returns function
//much later:
foo.retVal();
this
それでも、あなたは指摘することを期待しv
ますか?そして、それはデバッグするのが地獄ではないでしょうか?関数(メソッドかどうか)を呼び出すとthis
、関数が呼び出されるコンテキストオブジェクトのポインタになります。が戻ると、あなたの例では、関数はグローバルオブジェクトに返されます。したがって、これはまたはv.action('1')
を指します。this
window