1.什么是闭包
概念:
函数执行形成一个不销毁的私有作用域,除了保护私有变量不受干扰以外,还可以存储一些内容,这样的模式叫做
闭包
常见小实例:
for (var i = 0; i < 3; i++) { setTimeout(() => { console.log(i) }) } // 333 for (var i = 0; i < 3; i++) { // 利用自执行函数,形成不销毁的私有作用域,把当前的i存起来 ~function (i) { setTimeout(() => { console.log(i) }) }(i) } // 0 1 2
2、闭包的作用
闭包有两大作用:
保存和保护
1) 保护:
形成私有作用域,保护里面的私有变量不受外界干扰
例如
:团队协作开发,每个开发者把自己代码存放在一个私有作用域当中,防止相互之间的冲突;把需要共别人使用的方法,通过return或者window.XXX暴露在全局下即可(比如jQuery源码种也是利用保护机制实现的)~function (window) { var jQuery = function () { ... } ... window.$ = window.jQuery = jQuery; }(window);
真实项目中,我们利用这种保护机制,实现团队协作开发(避免多人用同一个命名,导致代码冲突的问题)
2) 保存:
函数执行形成一个私有作用域,函数执行完成,当前私有作用域(栈内存)中的某一部分内容被栈内存以外的其他东西(变量/元素的事件)占用了,当前占内存不能被释放掉,也就形成了不销毁的私有作用域(里面的私有变量也不会被销毁)
[形式]
函数执行返回了一个
引用数据类型堆内存地址
(并且堆内存隶属于这个作用域),在外面有一个变量接收了这个返回值,此时当前作用域就不能被销毁(想要销毁,只需要放外面的变量赋值为null,也就是不占用当前作用域中的内容了)// 实例: function fn () { var i = 1; return function (n) { console.log(n + i++) } } var f = fn() f(10) // 11 fn()(10) // 11 f(20) // 22 fn()(20) //21
3.末尾练习题:
// 练习题 // 例一: var i = 1; function fn () { return function (n) { console.log(n + i++) } } var f = fn() f(10) fn()(10) f(20) fn()(20) // 例二: function fn (i) { return function (n) { console.log(n + (++i)) } } var f = fn(10) f(20) fn(10)(20) f(30) fn(20)(10) f(40)