學習啦>知識大全>知識百科>百科知識>

js閉包是什么

時間: 歐東艷656 分享

  閉包(closure)是計算機編程領域的專業(yè)名詞,指可以包含自由(未綁定到特定對象)變量的代碼塊,子函數可以使用父函數中的局部變量。閉包源于要執(zhí)行的代碼塊和為自由變量提供綁定的計算環(huán)境(作用域)兩者的結合,Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Lua、objective c 以及Java(Java8及以上)等語言中都能找到對閉包不同程度的支持。


js閉包

  在Javascript中閉包(Closure)

  “官方”的解釋是:所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。

  相信很少有人能直接看懂這句話,因為他描述的太學術。我想用如何在Javascript中創(chuàng)建一個閉包來告訴你什么是閉包,因為跳過閉包的創(chuàng)建過程直接理解閉包的定義是非常困難的。看下面這段

  代碼

  functiona(){

  vari=0;

  functionb(){

  alert(++i);

  }

  returnb;

  }

  varc=a();

  c();

  特點

  這段代碼有兩個特點:

  1、函數b嵌套在函數a內部;

  2、函數a返回函數b。

  這樣在執(zhí)行完var c=a( )后,變量c實際上是指向了函數b,再執(zhí)行c( )后就會彈出一個窗口顯示i的值(第一次為1)。這段代碼其實就創(chuàng)建了一個閉包,為什么?因為函數a外的變量c引用了函數a內的函數b,就是說:

  當函數a的內部函數b被函數a外的一個變量引用的時候,就創(chuàng)建了一個閉包。

  例子

  模擬私有變量

  function Counter(start){

  var count = start;

  return{

  increment:function(){

  count++;

  },

  get:function(){

  return count;

  }

  }

  }

  var foo =Counter(4);

  foo.increment();

  foo.get();// 5

  結果

  這里,Counter 函數返回兩個閉包,函數 increment 和函數 get。 這兩個函數都維持著 對外部作用域 Counter 的引用,因此總可以訪問此作用域內定義的變量 count.

246703