簡體   English   中英

如何使這個簡單的javascript關閉工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM