[英]how to make this simple javascript closure work
我正在向這樣的朋友解釋javascript的關閉:
function outer() {
var count = 0;
return (function(){
count++;
console.log(count);
})();
}
我試圖向他展示,當執行外部函數時,如何存儲此“ count”變量。
因此,我嘗試在javascript控制台中執行此操作,並想向他展示當您在控制台中執行此操作時
outer(); // prints out 1
outer(); // calling again prints 2
outer(); // prints out 3
但實際上這發生了
outer(); // printed 1
outer(); // printed 1 again
outer(); // again 1
我不明白這里出了什么問題。 有人可以指導我。
感謝@elclanrs。 這是工作代碼。
function outer() {
var count = 0;
return (function(){
count++;
console.log(count);
});
}
現在,當我調用此函數並將其存儲在變量中時
var myouter = outer();
myouter();
// 1
// undefined
myouter();
// 2
// undefined
myouter();
// 3
// undefined
這是因為您的count
是在函數內部聲明的,因此它是函數范圍的“私有”,因此每次調用函數時,都會創建變量count
並將其初始化為0
然后內部函數(也稱為閉包)將其遞增,這就是為什么它顯示1
,然后當您的閉包返回時,因為范圍結束於此,所以您的count
變量被垃圾回收了-在匹配的花括號內,嘗試將count
移到任何函數的最外面,然后您將得到如果需要,那么您的count
將成為一個全局變量,這在生產代碼中是不好的,因為您不想污染全局池,並造成內存泄漏問題。 閉包基本上只是內部函數,就像Java中一樣。
每次調用outer()
時,您都設置count=0
。 如果您希望count
是私有的,這意味着不在全局范圍內,那么我將使用以下模塊模式:
var counter = (function(c){
var count = 0;
c.outer = function(){
count++;
console.log(count);
};
return c;
}({} || counter))
counter.outer();
或者您可以簡單地讓outer()
返回一個函數:
function outer() {
var count = 0;
return function(){
count++;
console.log(count);
};
}
var myo = outer();
myo();
myo();
myo();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.