函數式編程,閉包,做用域,全局變量

 function generateClosure(){
  var count = 0;

  var get = function(){
   return ++count;
 }

  return get;
}

var counter = generateClosure();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3

一個函數返回它內部定義的一個函數,就產生了一個閉包,閉包不只包括被返回的函數 ,還包括這個函數的定義環境。上面例子中,generateClosure內部的函數get被外部的變量counter引用時,counter和generateClosure的局部變量就構成了一個閉包。javascript

 function generateClosure(){
  var count = 0;

  var get = function(){
   return ++count;
 }

  return get;
}

var counter1 = generateClosure();
var counter2 = generateClosure();
console.log(counter1()); // 1
console.log(counter2()); // 1
console.log(counter1()); // 2
console.log(counter1()); // 3
console.log(counter2()); // 2

上面例子generateClosure調用了兩次,產生了兩個獨立的閉包實例,兩者的定義環境不同。能夠這樣理解,generateClosure返回get的時候,也將get能引用到的generateClosure的局部變量也返回了,並在內存中生成了一個副本。上面的例子即便把var換成let,值類型count換成對象count{value:0}必不會影響結果。java

相關文章
相關標籤/搜索