JavaScript---闭包技术 迈向高级JS程序员的必经之路

闭包why?

局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。闭包就实现了上述的功能,闭包使得函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期),让函数外部可以操作(读写)到函数内部的数据(变量/函数)。

闭包的创建:举例说明如下

当一个内部函数【b()】被其外部函数【a()】之外的变量【c】引用时,就形成了一个闭包。创建闭包的最常见的方式就是在一个函数【a()】内创建另一个函数【b()】,通过另一个函数【b()】访问这个函数【a()】的局部变量。

创建规则:函数嵌套;内部函数引用了外部函数的数据(变量/函数)。

闭包三个特性:

(1)函数嵌套函数

(2)函数内部可以引用外部的参数和变量

(3)参数和变量不会被垃圾回收机制回收

闭包有什么用,使用场景
使用闭包主要是为了设计私有的方法和变量,闭包的优点是可以避免全局变量的污染。

当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会“污染”全局的变量时,就可以用闭包来定义这个模块。

闭包的缺点
闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

函数套函数就是闭包吗?

不是!,当一个内部函数被其外部函数之外的变量引用时,才会形成了一个闭包。

常见的闭包使用形式:

1. 将函数作为另一个函数的返回值,2. 将函数的形参作为实参传递给另一个函数调用

闭包的生命周期:

产生:  在嵌套内部函数定义执行完时就产生了(不是在调用)

死亡:  在嵌套的内部函数成为垃圾对象时

闭包应用:

(一)同步和异步:借助小闭包, 把每次循环的i值都封闭起来; 当在事件函数中顺着作用域链中从内到外查找变量i, 会先找到被封闭在闭包环境中的i, 如果有3个按钮, 这里的i的值分别为0, 1, 2

(二)封装全局变量

作用域链条:JS中有很多作用域, 比如: 全局作用域 和  局部作用域

1. 凡是存在作用域的地方一定有作用域链条, 变量的查找都是沿着这条链条自内而外的;

2. 寻找变量都是递归遍历寻找, 当前作用域找不到, 就跳到上一个作用域遍历寻找, 直至顶层;

3. 作用域链条太长, 会影响程序运行效率

把一些不需要暴露在全局的变量封装成"私有变量"

(三)定义JS模块

将所有的数据和功能都封装在一个函数内部(私有的);只向外暴露一个包含多个方法的对象或函数;模块的使用者, 只需要通过模块暴露的对象调用方法来实现对应的功能


学习过程中,发现这篇文章写的深入人心,分享给大家 http://www.frontopen.com/1702.html

共同努力~希望自己的技术更上一层楼。

发布了147 篇原创文章 · 获赞 33 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/maidu_xbd/article/details/102537462
今日推荐