js閉包概念

含義:閉包是一個概念,它描述了函數執行完畢內存釋放後,依然內存駐留的一個現象,只要把握這個核心概念,閉包就不難理解了數組


function  a(){
  
    var  i=0;
  
   function  b(){
  
     alert(++i); 
  
    }
  
    return  b;
  
 }
  
  var  c = a();
  
 c();

即,閉包的做用就是在a執行完並返回後,閉包使得Javascript的垃圾回收機制GC不會收回a所佔用的資源,由於a的內部函數b的執行須要依賴a中的變量。閉包

因爲閉包的存在使得函數a返回後,a中的i始終存在,這樣每次執行c(),i都是自加1後alert出i的值。函數

 

閉包的概念:函數對象能夠經過做用域鏈相互關聯起來,函數體內的變量能夠保存在函數做用域內,這種特性被稱爲閉包。spa

var scope='global scope';  code

function checkscope(){對象

   var scope="local scope"; ip

  function f(){  return scope;  }  內存

  return f;  ci

}  資源

checkscope()();  

咱們知道調用函數checkscope(),咱們獲得的再也不是一個scope值,而是一個函數f;再接着調用函數f(),這裏就出現了一個問題,調用函數f是在全局環境中調用,其中的scope值從何而來?上面提到過一個概念:js是採用的詞法做用域,該scope值仍是來自於該函數即f定義時的做用域,而不是調用時的做用域。因此結果仍是local scope。

 

在犀牛書上還碰見一個例子比較經典。見代碼:

function constfuncs(){
  var funcs=[];
  for(var i=0;i<10;i++){
    funcs[i]=function{   return i ;  }
  }
  return funcs;
}
var funcs=constfuncs();
funcs[5]()

此時,結果的返回值是10;

結合上面的概念一步一步分析:

首先,constfuncs()函數執行之後獲得的是funcs數組,數組中是十個未執行的函數function(){return i}。當調用funcs[5]()的時候,變量i的值應該是函數在定義的時候i的取值,又由於直到i=10的時候循環才中止,因此,最後i的取值是10.函數調用返回值也是10。

從這裏不能看出:關聯到閉包的做用域鏈是「活動的」。嵌套函數不會將做用域內的私有成員複製一份,也不會對所綁定的變量生成靜態快照。

相關文章
相關標籤/搜索