概念
* 保护:函数执行形成私有上下文,此上下文中的私有变量和上下文以外的变量互不干扰;也就是当前上下文把这些变量保护起来了,我们把函数的这种保护机制称之为闭包「闭包不是具体的代码,而是一种机制」
* 保存:市面上认为只有形成的上下文不被释放,才是闭包,而此时不仅保护了私有变量,而且这些变量和存储的值也不会被释放掉,保存了起来
* 利用“保存+保护”机制,可以实现高阶编程技巧
题
1
var x = 100
function fn() {
var x = 200
return function (y) {
console.log(y + x++)
}
}
var f = fn()
f(10)
f(20)
/*
210
221
*/
2 多个闭包
var x = 5
function fn(x) {
return function (y) {
console.log(y + (++x))
}
}
let f = fn(6)
f(7)
fn(8)(9)
f(10)
console.log(x)
引申GC:浏览器垃圾回收机制「内存管理」
- 谷歌 -> 查找引用:空闲时,一次遍历:堆/栈
ps: EC(G)页面加载时创建,只有关闭才会被释放
- IE -> 引用计数:内存中数字N记录引用次数,占用累加,反之累减,N为0时释放
ps:常导致内存泄露,(总结可参考,高程三最后章节)
- 可用赋值null,手动取消内存占用
引申i++和i--区别
// *待解决:
let i = 2
console.log(2 + (++i) - (i++) + 3 - (i--) + (--i))
console.log(i)
3. 函数重构
let a = 0,
b = 0;
function A(a) {
A = function (b) {
alert(a + b++)
}
alert(a++)
}
A(1)
A(2)
引申,let连等
let a=b=1
// 等价于
b=1 // *注意:此处b未执行声明
let a=1