宝哥软件园

初学者js闭包学习过程分析

编辑:宝哥软件园 来源:互联网 时间:2021-08-19

闭包,实际上是一种语言特性,这意味着在编程语言中,允许将函数视为对象,然后可以像对象中的操作一样在函数中定义实例(局部)变量,这些变量可以保存在函数中,直到函数的实例对象被破坏,其他代码块可以通过某种方式获得这些实例(局部)变量的值,并扩展它们的应用。

我们的理解是:

事实上,闭包是一个函数。外部函数通过调用函数并返回来返回内部函数。这里的内部函数是闭包;此时,外部函数的变量可以在内部函数中访问;

要理解闭包,首先要理解栈内存和范围链;首先,我们来谈谈堆栈内存:

首先,让我们看一个演示:

var a=1;Var obj={'name': '咸鱼' }上面两个简单的代码实际上在内存中做了两件事,渲染如下:

在文章js《Deep and Light Copy的简单实现》(https://www . JB 51 . net/article/171389 . htm)中,我们知道基本数据类型存储在堆栈内存中,引用数据类型存储在堆内存中。事实上,以上两个代码在内存中做了两件事:1。首先,在堆栈内存中打开一个空间来存储变量和A的值;2.在堆内存中打开一个空间来存储obj的值,并将地址指向堆栈内存中的变量名obj

如果我们在代码底部加一句obj={'name': '张三' },此时我们存储的是咸鱼的值,即obj的原值会被js中的垃圾回收机制回收,然后obj的值会再次指向{name 3360 '张三'的值};

范围链

让我们再看一遍这个例子:

var a=1;函数fn(){ var b=2;函数fn1(){ console . log(b);//2 console . log(a);//1 } fn1();} fn();效果图如下:

1.var a=1此时我们处于全局执行环境,浏览器的全局环境就是窗口范围,我们的窗口范围有a和fn;

2.当我们进入fn时,一个新的执行环境将在堆栈内存中打开。此时,我们在fn的执行环境中有B和fn1

3.当我们下到fn1时,堆栈内存也会打开一个新的执行环境。此时fn1的执行环境中没有变量数据,但是我们在fn1中输出A和B,我们可以读取;这是因为程序开始从内到外读取变量,开始用fn1一层接一层的查找,这就是执行顺序(fn1=fn=window)。如果没有在窗口中读取变量,程序将报告错误。

当然,在执行过程中,如果垃圾收集机制检测到程序被执行,会进行垃圾收集,避免内存泄漏等问题;也就是说,fn1的范围在我们的fn1执行完之后会被销毁,然后程序在fn执行完,fn执行完之后会被销毁;当程序全局执行时,整个程序中将没有fn和fn1的作用域,只有浏览器、窗口的全局作用域。此时,窗口中只剩下A和FN。

了解了范围链、堆栈内存和堆内存的上述知识之后,让我们开始解释js闭包:

函数outer () {var a=' 123 '返回函数add(){//这里,因为作用域的关系,add可以访问outer的所有变量,但是outer是一个不能访问add的变量;//所以换个思路后,返回add的值作为结果,灵活实现外部外部函数访问内部函数变量。//add是闭包函数,因为他可以访问外部函数的作用域,如果add中没有找到变量A,他会继续在上层作用域中寻找console . log(A);}}var inner=outer() //获取add闭包函数inner() //'123 '。首先,我们可以看到我们在全球范围内有一个外部功能。外部作用域中有A和add,add作用域中的变量执行控制台输出A,此时这里的add函数形成一个闭包。因为add函数需要访问外部作用域中的A变量,但它们不在同一个作用域中,所以相互拉取,需要输出A,当作用域链找到外部时,必须找到外部的A变量。输出A时,垃圾收集机制会认为add还没有执行,因为此时范围链搜索已经到达了外部范围,所以不会清理A的内存空间;所以这会带来一个问题:如果我们多次使用闭包,会给我们的程序带来太多的内存,导致性能问题;

访问函数内部的全局变量是javascript语言的一个特色,但如果我们想访问函数外部的内部变量,可以使用闭包,这就是闭包带给我们的便利;

闭包的优点和缺点:

优点:

1.您可以读取函数内部的变量

2.全球污染是可以避免的

缺点:

1.闭包会导致变量没有被垃圾收集机制清除,会消耗大量内存;

2.闭包使用不当可能导致内存泄漏;

总结:

1.在范围链中查找变量的方法是逐层查找,直到找到为止。如果没有找到窗口的全局范围,则报告为未定义;

2.在嵌套函数中,由于不在同一个作用域内,正常情况下,内部函数和外部函数不能访问内部函数,但可以通过闭包来实现;

3.尽量少用闭包,因为会造成内存消耗,可能会造成内存泄漏(如果不需要,就不要随便用);

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+