由匿名函数引发的‘血案’

时间:2022-09-20 07:35:00

看了下时间,发现已经年末了,前段时间一直忙着做一个关于学生评价辅导员的系统,本人处女作,因为是第一次,做的也比较慢,所以很久没进行知识的总结。
不过在制作过程,看了挺多的资料,特此在这闲暇的下午,写一篇小小的文章,写的不好,请多多指教 由匿名函数引发的‘血案’,不过应该较之以前都有所提高,自己的东西多了,废话不多说,直接进入正题!

数据的存储

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事件时,内存会随机分配相应的空间给匿名函数,而当事件处理后,系统对该内存进行回收,并且是随机性分配,所以上下两个匿名函数是不一样的,从而清楚相应的事件处理程序无效。

由于匿名函数功能之强大,所以在本文不对其进行更多的讲解
欢迎大家拍砖,指出不当之处,谢谢!!!