淺談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());//sj
在function里面的name,由于是在function作用域中,所以外部無法訪問,但是可以通過創(chuàng)建person對象,調(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)。
以上所述是小編給大家介紹的js閉包理解詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
js中escape對應(yīng)的C#解碼函數(shù) UrlDecode
js中escape對應(yīng)的C#解碼函數(shù) System.Web.HttpUtility.UrlDecode(s),使用過程中有以下幾點(diǎn)需要注意2012-12-12JavaScript Math.ceil 方法(對數(shù)值向上取整)
js Math.ceil用于對數(shù)值向上取整,即得到大于或等于該數(shù)值的最小整數(shù),需要的朋友可以參考下2015-01-01javascript獲取函數(shù)名稱、函數(shù)參數(shù)、對象屬性名稱的代碼實(shí)例
這篇文章主要介紹了javascript獲取函數(shù)名稱、函數(shù)參數(shù)、對象屬性的代碼實(shí)例,需要的朋友可以參考下2014-04-04Javascript實(shí)例教程(19) 使用HoTMetal(7)
Javascript實(shí)例教程(19) 使用HoTMetal(7)...2006-12-12JavaScript基礎(chǔ)知識(shí)之?dāng)?shù)據(jù)類型
JavaScript中有5種簡單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number和String。還有1種復(fù)雜數(shù)據(jù)類型——Object,Object本質(zhì)上是由一組無序的名值對組成的2012-08-08