淺析javascript閉包 執行個體分析

來源:互聯網
上載者:User

官方解釋
“閉包”是一個擁有許多變數和綁定了這些變數的環境運算式(通常是一個函數),因而這些變數也是環境運算式的一部分。
通俗解釋
Javascript中所有的函數都是一個閉包。不過一般來說,嵌套的function產生的閉包更為強大,也是大部分時候我們所說的“閉包”。看如下代碼: 複製代碼 代碼如下:<script type="text/javascript">
<!--
//外層函數a
function a(){
//臨時變數i
var i = 0;
//內層函數b
function b(){
//引用外層臨時變數i
alert(++i);
}
//執行結果,返回內層函數b
return b;
}
//執行外層函數a,同時給c一個指向內層函數b的引用
//若按正常理解,此語句執行完後i將被GC回收,此時的i應為“undefine”
var c = a();
//執行內層函數,由於閉包的緣故,函數b中i仍然引用的是外部的臨時變數i
c();
-->
</script>

這段指令碼在執行完var c=a()之後,變數c實際上就指向了函數b,b中用到了變數i,再執行c()後就會彈出一個視窗顯示i的值。這段代碼其實就是一個閉包,為什嗎?因為函數a外的變數c引用了函數a內部的函數b。
Javascript的記憶體回收機制
由於javascript特殊的記憶體回收機制,才導致了閉包的產生。Javascript記憶體回收機制的大體規則如下:
在javascript中,如果一個對象不再被引用,那麼這個對象就會被GC回收。如果兩個對象相互引用,而不再被第3者引用,那麼這兩個互相引用的對象也會被回收。而在上述的指令碼中,函數a被b引用,函數b又被函數a外的c所引用,這就是為什麼函數a執行後不被回收的原因。
閉包的應用情境
1. 保護函數內的變數安全。以上面的例子為例,函數a中變數i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。
2. 在記憶體中維持一個變數。依然如上面的例子,由於閉包,函數a中的i一直存在於記憶體中,因此每次執行c(),i都會加1。
3. 通過保護變數的安全實現JS私人屬性和私人方法(不能被外部存取)。如下,私人屬性和私人方法在Constructor外是無法訪問的: 複製代碼 代碼如下:function Constructor(…){
var that = this;
var membername = value;
function membername(…){…}
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.