JavaScript高级重点整理(三、闭包)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaScript高级重点整理(三、闭包),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2187字,纯文字阅读大概需要4分钟。
内容图文
闭包
- 如何产生闭包?
- 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包
- 注意点
- 函数嵌套
- 内部函数引用了外部函数的数据(变量/函数)
- 即使外部有其他变量,只要不被引用闭包内就不会有那个值,如果内部没有引用值,也就不会有闭包。
-
- 闭包存在于嵌套的内部函数中
常见的闭包
-
将函数作为另一个函数的返回值
function fn1() { var a = 2//在这一步时闭包和a都为undefined,因为var a;只是声明 //之后a = 2,后闭包和a同时都为2了 function fn2() { a++ console.log(a) } return fn2 } var f = fn1() f() // 3 f() // 4
在这段代码中只生成了一个闭包,但这个闭包一直保存着引用值。
只要调用1次fn1就会产生一个闭包,闭包的数量取决于fn1(外部函数)的调用次数
-
将函数作为实参传递给另一个函数调用
function showDelay(msg, time) { setTimeout(function () { alert(msg) }, time) } showDelay('atguigu', 2000)
其中的msg就是闭包,但是time不是。
闭包的作用
- 使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期)
- 让函数外部可以操作(读写)到函数内部的数据(变量/函数)
- 相当于函数暴露了一个口给我们,然后我们通过这个口来调用修改函数的局部变量(其实没有在闭包中的已经释放掉了,但是在闭包中的和局部变量保持一致),局部变量可以看做是存在于闭包里面
- 通过对闭包操作来达到操作内部变量的效果
来看下面这段代码
function fn1() {
var a = 2
function fn2() {
a++
console.log(a)
// return a
}
function fn3() {
a--
console.log(a)
}
return fn3
}
var f = fn1()
f() // 1
f() // 0
? 在fn1函数执行完后,局部变量a存在于闭包没有被释放,但fn2和fn2指向的函数对象(被当做垃圾回收)fn3变量都被释放了,但是fn3指向的变量被赋给了f(赋的地址值)此时闭包也还存在。
闭包的生命周期
function fn1() {
//此时闭包就已经产生了(函数提升, 内部函数对象已经创建了)
var a = 2
function fn2 () {
a++
console.log(a)
}
return fn2
}
var f = fn1()
f() // 3
f() // 4
f = null //闭包死亡(包含闭包的函数对象成为垃圾对象)
注意:如果是用 var fn2 =function (){}来定义函数的话,就要等整个函数执行完才会有闭包
闭包的缺点及解决
- 缺点
- 函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长
- 容易造成内存泄露
- 解决
- 能不用闭包就不用
- 及时释放
内存溢出与内存泄露
内存溢出:
- 一种程序运行出现的错误
- 当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误
内存泄露:
- 占用的内存没有及时释放
- 内存泄露积累多了就容易导致内存溢出
- 常见的内存泄露:
- 意外的全局变量
- 没有及时清理的计时器或回调函数
- 闭包用完后没有及时处理
内容总结
以上是互联网集市为您收集整理的JavaScript高级重点整理(三、闭包)全部内容,希望文章能够帮你解决JavaScript高级重点整理(三、闭包)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。