2016-05-08 45 views
1

什麼之間的差異(在num++):這個javascript關閉有什麼區別?

function numberGenerator() { 
    // Local 「free」 variable that ends up within the closure 
    var num = 1; 
    function checkNumber() { 
    console.log(num); 
    } 
    num++; 
    return checkNumber; 
} 

var number = numberGenerator(); 
number(); // 2 
number(); // 2 
number(); // 2 

function numberGenerator() { 
    // Local 「free」 variable that ends up within the closure 
    var num = 1; 
    function checkNumber() { 
    console.log(num); 
    num++; 
    } 
    return checkNumber; 
} 

var number = numberGenerator(); 
number(); // 1 
number(); // 2 
number(); // 3 

爲什麼不第一碼記住num價值?

爲什麼是2而不是1?

回答

1

事實上它記得非常好。 num的變量名稱值始終爲2,無論你堅持多少次調用它;即:執行變量名稱的返回關閉號碼

它將永遠留2

這是因爲在第一個功能你關閉

  1. 沒有保持對NUM變量。

  2. 不會導致增加增加。

  3. 每次調用都會返回主機函數(num ++)增加的結果,這隻發生過一次。而它的價值已經是2

都是一樣的,如果你打電話numberGenerator,又因爲NUM價值將被重新申報/重置爲1比增加,在自我分配一個值2它的下一個聲明。

所以,沒有什麼區別,它只是在你的第一個封閉,不能增加變量值,因爲它沒有意味着要做到這一點。

3

因爲在第一個示例中運行number()時,num++不會再次執行,因爲它不在該函數中。

1

實例1用var num = 1;初始化,然後用num++;增加。不要緊,你怎麼經常打電話的第一個函數,因爲num值永遠不會再次改變,它永遠是2.只有console.log(num);執行,當你調用number()例1中

在例2 num++;是每次調用函數時執行。因此每次通話都會增加。

+0

非常好。所以num的原因是2而不是1是因爲在數字的初始賦值時,它在返回關鍵字之前遞增。在呼叫號碼時,它只會執行並記住內部函數中的內容?! – MAA

1

在函數調用時(var number = numberGenerator),閉包'checkNumber()'可以訪問局部變量'num',並且即使在用num ++增加後也會保留該值。閉包可以直接訪問局部變量'num',並在每次使用變量'number'訪問時更改它。這僅在num ++處於閉包內部時才起作用,因爲閉包可以直接訪問包含在其中的函數中的局部變量。Douglas Cockford的書「JavaScript:good parts」幫助我創建和理解關閉。
我希望這有助於!