簡體   English   中英

封閉如何幫助函數知道前一個函數調用的私有變量

[英]how does closure help a function to knowing the previous function call's private variable

我試圖了解關閉,我認為我理解它,直到我遇到以下解決方案:

我不明白這將如何提醒0,1,2,3,4,5

var next = (function(){
    var r = 0;
  return function(){
    return r++;
  }

})()

for (var i = 0; i<=5; i++){
    alert(next());
}

我理解第一次迭代是如何工作的,只有next ,函數將執行並返回return函數,然后next ()接下來將執行返回的函數。 我也明白,執行時返回函數會因為Closure而訪問變量r。

但是我不明白在下一次迭代中,r的狀態會持續存在。 next()再次運行的下一次迭代中, r變量將在函數范圍內並且不會受到全局中任何事物的影響,它如何知道前next()中的r的狀態next() 即使是這樣,也不會var r = 0復位r回0?

外部IIFE僅運行一次 ,如末尾的()

var next = (function(){
  var r = 0;
  return function(){
    return r++;
  }
})()
  ^^

因此,當解釋器遇到var next = ...行時,IIFE運行,創建r變量,然后返回以下函數:

function(){
  return r++;
}

next被分配給調用IIFE的結果,IIFE返回該函數。 因此,在將來,當你調用next ,你正在調用上面的那個(小)函數 - 調用next不再調用整個IIFE,並且只有一個綁定r變量。

next是一個創建了runinv熏制函數,你是對的,每次調用next都會創建一個帶有r的新綁定的新函數:

 var next = function(){ var r = 0; return function(){ return r++; } } for (var i = 0; i<=5; i++){ var theFn = next(); console.log(theFn()); } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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