2012-11-16 186 views
3

我有以下兩個計數器函數,它們在運行時返回不同的結果。JavaScript執行函數返回函數

在第一個片段中,計數器函數分配給變量letsCount,它看起來像執行函數更新計數器函數中的變量計數。

但是在第二個片段中,直接執行函數並不會更新count變量。

請你解釋爲什麼他們有不同的結果,當返回函數的函數被分配給一個變量時會發生什麼?

片段1

function counter() { 
    var count = 0; 
    return function() { 
     console.log(count++); 
    } 
} 
var letsCount = counter(); 
letsCount(); // 0 
letsCount(); // 1 
letsCount(); // 2 

片段2

function counter() { 
    var count = 0; 
    return function() { 
     console.log(count++); 
    } 
} 
counter()(); // 0 
counter()(); // 0 
counter()(); // 0 
+3

無論何時調用'counter',都會創建一個新函數並將'count'設置爲'0'。 –

回答

2

每次通話時間counter()您創建一個新的匿名函數實例,有自己的作用域變量。如果你想使用相同的功能,以保持,你將不得不做這樣的事情:

var counter = (function() { 
    var count = 0; 

    var fn = function() { 
     console.log(count++); 
    }; 

    return function() { 
     return fn; 
    }; 
})(); 

counter()(); // 0 
counter()(); // 1 
counter()(); // 2 

單個匿名函數將被創建,然後存儲在作用域fn功能,那麼我們就返回它,調用時函數,將返回fn保留的值。

0

在你用一個函數指針引用它的第一種情況.. 所以上下文被保存

而在第二種情況下,你調用的函數,wherin計數爲0。 所以變量就是出在這裏上下文的,,所以你看不到價值爲0

1

片段1片段2在它們的調用不同。您的第一個片段引用了一個返回的函數,並且該函數保留在其範圍內(是關閉,參考count)。

您的第二個代碼段每次調用外部函數,總是返回一個新函數的引用,並重新關閉到新的計數

0

這實際上是完美的,爲什麼你會得到這種行爲。當你調用counter()(),第一counter()調用執行,有效地重置變量count爲0。如果一個變量設置爲counter(),你實際上是將其設置爲返回的函數:

var letsCount = // (function() { 
    // var count = 0; 
    return function() { 
     console.log(count++); 
    } 

// })(); 

然後當你調用letsCount ,你正在調用返回的函數而不是外部函數。