由匿名函數引發的‘血案’


看了下時間,發現已經年末了,前段時間一直忙着做一個關於學生評價輔導員的系統,本人處女作,因為是第一次,做的也比較慢,所以很久沒進行知識的總結。
不過在制作過程,看了挺多的資料,特此在這閑暇的下午,寫一篇小小的文章,寫的不好,請多多指教 ,不過應該較之以前都有所提高,自己的東西多了,廢話不多說,直接進入正題!

數據的存儲

Java、C等其他高級編程語言

首先我們應該都了解過Java或C其中一種吧(我的學校兩門課都開設了), 相信學過這些語言的小伙伴們都應該清楚在存儲數據時,棧中存儲原始數據類型,而堆里則存放引用數據類型,But,But,But引用類型的指針變量是存放在棧里的,為了更好地理解,請繼續看:

代碼

int i = 5; // 原始數據類型
int arr[5] = {1,2,3}; //  引用數據類型

內存分析


(補充: 堆和棧其實是同一個東西,只是由於存儲數據的算法不同,而把內存划分為棧內存和堆內存, 本人學習java過去已好久,也許有不對之處,望指出!)

有請主角JavaScript登場

在弱類型編程語言JS中,數據的存儲依托於一個叫做變量對象的東東,話不多說(其實是我知道的並不多,嘻嘻~~~),直接來個栗子:

代碼

var i = 5; // 原始數據類型
var obj = new Object(); // 引用數據類型

內存分析

下面我要來點猛的了,前方高能,准備好啊,准備好啊,准備好啊

關於JS函數二三事

  1. 眾所周知,函數就是對象,地位可顯赫了,乃JS世界的"一等公民"
  2. 既然函數是對象,那為何使用typeof操作符時卻返回"function",你丫是不是在逗我。No、no、no,之所以為"function",是由於對象中的內部屬性決定的,語言設計者只給函數一個[[call]]的內部屬性,這才區分了函數和其他對象的不同

有關匿名函數,我們就從函數表達式切入吧!!!

var fn = function () {
	// code
};

從上圖我們可以得出,一個匿名函數也就是沒有地址內存的一塊空間,其生存期即被調用后就被清除.

所以我們就好理解以下代碼了:

dom.addEventListener('click', function(){
	// code
}, false);
dom.removeEventListener('click', function(){
	// code
}, false); // 無效,無法清除上面添加的事件處理程序

因為在dom對象觸發了click事件時,內存會隨機分配相應的空間給匿名函數,而當事件處理后,系統對該內存進行回收,並且是隨機性分配,所以上下兩個匿名函數是不一樣的,從而清楚相應的事件處理程序無效。

由於匿名函數功能之強大,所以在本文不對其進行更多的講解
歡迎大家拍磚,指出不當之處,謝謝!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM