5.函数底层处理机制(闭包)

126 阅读1分钟

概念

* 保护:函数执行形成私有上下文,此上下文中的私有变量和上下文以外的变量互不干扰;也就是当前上下文把这些变量保护起来了,我们把函数的这种保护机制称之为闭包「闭包不是具体的代码,而是一种机制」
* 保存:市面上认为只有形成的上下文不被释放,才是闭包,而此时不仅保护了私有变量,而且这些变量和存储的值也不会被释放掉,保存了起来
* 利用“保存+保护”机制,可以实现高阶编程技巧

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)


/*
  14
  18
  18
  5
*/

引申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
  2
*/

3. 函数重构

let a = 0,
  b = 0;
function A(a) {
  A = function (b) {
    alert(a + b++)
  }
  alert(a++)
}
A(1)
A(2)

/*
    1
    4
*/

引申,let连等

let a=b=1
// 等价于
b=1 // *注意:此处b未执行声明
let a=1