閉包

什么是閉包

閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的常見的方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù),通過另一個函數(shù)訪問這個函數(shù)的局部變量。

function f1(){
   var n=999;
   return function (){
      console.log(n++);
     }
} 
var result=f1();
result(); // 999
result(); // 1000

當匿名函數(shù)被返回時,我們會初始化其作用域鏈,包含了f1()的活動對象和全局變量對象,這樣匿名函數(shù)就可以訪問f1()的變量,而且f1()函數(shù)執(zhí)行完畢后,他的活動對象不會銷毀,因為匿名函數(shù)的作用域鏈仍然保存著對他的引用。

1. 從理論角度來說:
所有的函數(shù)都是閉包。因為所有的函數(shù)在創(chuàng)建的時候就將上層的上下文的作用域鏈保存起來。即使在函數(shù)中訪問了全局變量相當于訪問自由變量。
2. 從實踐角度:需要滿足以下條件:

  1. 即使創(chuàng)建他的上下文已經(jīng)銷毀,他仍然存在
  2. 在代碼中引用了自由變量(跨了自己的作用域的變量)

循環(huán)中的閉包

看下面這個例子:

function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = function(){
            return i;                            
        }                                  
    }                               
    return arr;
}                           
console.log(box()[0]());      

結(jié)果是5,是數(shù)組中的第一個數(shù)返回的值,

為什么????

一個函數(shù)的創(chuàng)建伴隨著他的執(zhí)行環(huán)境和作用域鏈,我們需要在作用域中查找變量 i ,如果在當前的匿名函數(shù)內(nèi)沒有找到,那就要到上一層的作用域去找,找到 i 的值 。
作用域鏈的本質(zhì)是指向變量對象的指針列表,不包含實際的變量對象。但是閉包中保存的的是整個變量對象,而不是某一個具體的值。所以每個匿名函數(shù)的父作用域是同一個,他們的 i 都指向同一個變量對象,最終的 i 是5。

解決方法:
function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = (function(e){
             return e;               
        })(i)                       
    }             
    return arr;
}                       
console.log(box());   //輸出 [0, 1, 2, 3, 4]

function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = (function(e){
           return function(){
             return e;
           }                 
        })(i)                       
    }             
    return arr;
}                           
console.log(box()[0]());   //輸出0,是數(shù)組中的第一個數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ● 閉包基礎(chǔ) ● 閉包作用 ● 閉包經(jīng)典例子 ● 閉包應(yīng)用 ● 閉包缺點 ● 參考資料 1、閉包基礎(chǔ) 作用域和作...
    lzyuan閱讀 1,032評論 0 0
  • 作用域和閉包是 JavaScript 最重要的概念之一,想要進一步學(xué)習(xí) JavaScript,就必須理解 Java...
    劼哥stone閱讀 1,240評論 1 13
  • 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應(yīng)用都要依靠閉包實現(xiàn)。 一、變量...
    zock閱讀 1,117評論 2 6
  • 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應(yīng)用都要依靠閉包實現(xiàn)。 一、變量...
    zouCode閱讀 1,357評論 0 13
  • 閉包沒有想象的那么簡單 閉包的概念在JavaScript中占據(jù)了十分重要的地位,有不少開發(fā)者分不清匿名函數(shù)和閉包的...
    老馬的春天閱讀 773評論 2 8

友情鏈接更多精彩內(nèi)容