js閉包

閉包是js中的一大特色,也是一大難點(diǎn)。簡單來說,所謂閉包就是說,一個(gè)函數(shù)能夠訪問其函數(shù)外部作用域中的變量。

閉包的三大特點(diǎn)為

1、函數(shù)嵌套函數(shù)

2、內(nèi)部函數(shù)可以訪問外部函數(shù)的變量

3、參數(shù)和變量不會(huì)被回收。

舉例來說:

function test(){

? ? var a=1;

? ? return function(){

? ? ? alert(a);

? ? }

? }

? var try=test();

? try();//彈出a的值

這個(gè)例子中,變量a在test方法外部是無法訪問的,但test方法里面,嵌套了一個(gè)匿名函數(shù),通過return返回,test作用域中的變量a,

可以在匿名函數(shù)中訪問。并且當(dāng)test方法執(zhí)行后,變量a所占內(nèi)存并不會(huì)釋放,以達(dá)到嵌套的函數(shù)還可以訪問的目的

閉包的作用在于,可以通過閉包,設(shè)計(jì)私有變量及方法。

舉例來說:在java中創(chuàng)建perosn類,含有私有變量name。

public class Person{

? ? private String name='wy';

? ? public Person(val){

? ? ? name=val;

? ? }

? ? public void setName(val){

? ? ? name=val;

? ? }

? ? public String getName(){

? ? ? return name;

? ? }

}

在js中實(shí)現(xiàn)類似java創(chuàng)建類的功能:

(function(){

? ? ? ? ? ? var name="wangyu";

? ? ? ? ? ? Person=function (val) {

? ? ? ? ? ? ? ? name=val;

? ? ? ? ? ? }

? ? ? ? ? ? Person.prototype.setName=function(val){

? ? ? ? ? ? ? ? name=val;

? ? ? ? ? ? }

? ? ? ? ? ? Person.prototype.getName=function () {

? ? ? ? ? ? ? ? return name;

? ? ? ? ? ? }

? ? ? ? })();

? ? ? var person1=new Person("sj");

? ? ? alert(this.name)//undefined 因?yàn)樵趂unction作用域外不能訪問

? ? ? alert(person1.getName());//wangyu

在function里面的name,由于是在function作用域中,所以外部無法訪問,但是可以通過創(chuàng)建person對(duì)象,調(diào)用person的方法,來達(dá)到

修改和訪問name值的目的,類似于java類中的私有變量,外部無法訪問,只能通過類方法訪問。

再看一個(gè)私有變量的例子:

var aaa = (function(){

? ? ? ? var a = 1;

? ? ? ? function bbb(){

? ? ? ? ? ? ? ? a++;

? ? ? ? ? ? ? ? alert(a);

? ? ? ? }

? ? ? ? function ccc(){

? ? ? ? ? ? ? ? a++;

? ? ? ? ? ? ? ? alert(a);

? ? ? ? }

? ? ? ? return {

? ? ? ? ? ? ? ? b:bbb,? ? ? ? ? ? //json結(jié)構(gòu)

? ? ? ? ? ? ? ? c:ccc

? ? ? ? }

? ? })();

? ? alert(aaa.a)//undefined

? ? aaa.b();? ? //2

? ? aaa.c()? ? ? //3

總結(jié):

1、閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的最常見的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量。閉包的缺點(diǎn)就是常駐內(nèi)存,會(huì)增大內(nèi)存使用量,使用不當(dāng)很容易造成內(nèi)存泄露。

2、不必糾結(jié)到底怎樣才算閉包,其實(shí)你寫的每一個(gè)函數(shù)都算作閉包,即使是全局函數(shù),你訪問函數(shù)外部的全局變量時(shí),就是閉包

的體現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 閉包(closure)是Javascript語言的一個(gè)難點(diǎn),也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。 一、變量...
    zock閱讀 1,118評(píng)論 2 6
  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的?。?因?yàn)镾cala是基于Java虛擬機(jī),也就是...
    燈火gg閱讀 3,608評(píng)論 1 24
  • 數(shù)學(xué)中的閉包與JS閉包 數(shù)學(xué)上,閉包是指一個(gè)集合在某個(gè)運(yùn)算下閉合,也就是對(duì)該集合進(jìn)行某種運(yùn)算,得到的結(jié)果仍屬于該集...
    seafruit閱讀 433評(píng)論 1 3
  • 閉包: 官方”的解釋是:閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該...
    小裁縫sun閱讀 709評(píng)論 0 5
  • 辛先生最近新買了燙斗,說是熨襯衫用的。 唐小茴沒怎么穿過襯衫,好像那樣正經(jīng)的襯衫也不適合她,但也不能說沒穿過襯衫,...
    唐小茴閱讀 102評(píng)論 0 0

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