1. 程式人生 > >js閉包概念

js閉包概念

-a text 應該 gpo pac const lpad 靜態 函數對象

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


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的值。

閉包的概念:函數對象可以通過作用域鏈相互關聯起來,函數體內的變量可以保存在函數作用域內,這種特性被稱為閉包。

var scope=‘global scope‘;

function checkscope(){

   var scope="local scope";

  function f(){  return scope;  }

  return f;

}

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。

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

js閉包概念