閉め切った私が会いましょう
1809 ワード
功利的な話をしてください.もしあなたが面接の時にJAvascriptと関数の話をしてプログラムを作ったら、その人があなたにクローズドを説明させます.結果がもしはっきりしないと言えないならば.今回の面接は基本的に終わります.
閉包については自分でもよく分かりません.自分で記録して条例を整理します.まず例を挙げてください.
運行環境はV 8のshellで、前述のchromeのjsエンジンです.
だからみんなここにいます.
初めてBugu.testを呼び出します.uvalue++は1になり、1を出力します.
第二回はBugu.testを呼び出して、まだカバンを閉じています.uvalueもいます.uvalue+は2になり、2を出力します.
これは簡単な例です.複雑な話をします.
閉包については自分でもよく分かりません.自分で記録して条例を整理します.まず例を挙げてください.
運行環境はV 8のshellで、前述のchromeのjsエンジンです.
var Bugu = new Object();
Bugu.test = (function(){
var upvalue = 0;
return function(){
upvalue ++;
print(upvalue);
}
})();
Bugu.test();
Bugu.test();
bugu@bugu-love:~/javascript$ ./d8 closure.js
1
2
これはよく分かります.Bugg.testの後ろにあるのは声明すなわち呼び出しのテクニックを応用しています.実際にBugg.testは
return function(){
upvalue ++;
print(upvalue);
}
このクローズドは、なぜクローズドされていますか?彼は自分に戻り、Bugg.testに値を与えています.外部変数は再割り当てされていません.削除されていません.外部変数の存在には、この匿名関数のサポートが必要です.だから、匿名関数はgcされていません.匿名関数はuvalue変数を含んでいます.上位関数もgcには使えません.この変数が必要です.だからみんなここにいます.
初めてBugu.testを呼び出します.uvalue++は1になり、1を出力します.
第二回はBugu.testを呼び出して、まだカバンを閉じています.uvalueもいます.uvalue+は2になり、2を出力します.
これは簡単な例です.複雑な話をします.
var Bugu = new Object();
Bugu.test = (function(){
var upvalue = 0;
return function(){
this. u = upvalue ++;
print('init');
this.getValue = function(){
return this.u;
}
}
})();
var t1 = new Bugu.test();
var t2 = new Bugu.test();
print(t1.getValue());
print(t2.getValue());
bugu@bugu-love:~/javascript$ ./d8 hello.js
init
init
0
1
これは2つのオブジェクトを作成するのに相当しますが、上記の例と同じです.最初のオブジェクトを作成する場合は、uplevelは0で、uに値を付けます.二つ目のオブジェクトを作成する時は、まだクローズドされています.gcされていませんので、この時はuplevel++は、1です.uに値を与えます.最終回