闭包作用:
闭包:
我们把函数执行,形成私有上下文,来保存和保护私有变量的机制,称之为“闭包” =>它是一种机制
函数执行会形成全新的私有上下文,这个上下文可能被释放,也可能不被释放,不论是否被释放,它的作用是:
保护
:划分一个独立的代码执行区域,在这个区域中有自己私有变量存储的空间,而用到的私有变量和其它区域中的变量不会有任何的冲突(防止全局变量污染)保存
:如果上下文不被销毁,那么存储的私有变量的值也不会被销毁,可以被其下级上下文中调取使用
let x = 1;
function A(y){
let x = 2;
function B(z){
console.log(x+y+z);
}
return B;
}
let C = A(2);
C(3);
let 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);
函数每一次执行 都是从新形成一个全新的私有上下文,和之前执行产生的上下文没有必然的联系 如:fn(8)(9)执行 与 f 没有关系,重头执行函数
let a=0,
b=0;
function A(a){
A=function(b){
alert(a+b++);
};
alert(a++);
}
A(1);
A(2);
- GO 全局对象window 堆内存 浏览器内置的API
- VO(G) 全局变量对象 上下文中的空间 全局上下文中创建的变量
- 基于var/function在全局上下文中声明的全局变量也会给GO赋值一份(映射机制)
- 但是就let/const等ES6方式在全局上下文中创建的全局变量和GO没有关系
- var/function存在变量提升 但是let/const不会
浏览器的垃圾回收机制(自己内部处理):
[谷歌等浏览器是“基于引用查找“来进行垃圾回收的]
- 开辟的堆内存,浏览器自己默认会在空闲的时候,查找所有内存的引用,把那些不被引用的内存释放掉
- 开辟的栈内存(上下文)一般在代码执行完都会出栈释放,如果遇到上下文中的东西被外部占用,则不会释放
[IE等浏览器是“基于计数器”机制来进行内存管理的]
- 创建的内存被引用一次,则计数1,再被引用一次,计数2… 移除引用减去1… 当减为零的时候,浏览器会把内存释放掉
=>真实项目中,某些情况导致计数规则会出现一些问题,造成很多内存不能被释放掉,产生“内存泄漏”;查找引用的方式如果形成相互引用,也会导致“内存泄漏“
大部分的"内存泄漏"都发生在IE浏览器中
总结:内存泄漏导致的情况?
JS高级程序设计第三版 最后章节中有介绍
let obj={name:‘XXX’}
let oop=obj;
obj不会被释放
i++ 和 ++i 的运算
i++ 先拿原始值运算 运算完自身+1
如
i=10
5+i++
//先计算 5+i =>15
//再计算 i++ => i=11
即使小括号把i++包起来,也是这样运算的 5+(i++)=10
i=10
5+(++i)
++i 先累加1,累加后的结果在运算
++i => i=11
5+11 => 16