闭包和作用域

闭包作用:

闭包:我们把函数执行,形成私有上下文,来保存和保护私有变量的机制,称之为“闭包” =>它是一种机制

函数执行会形成全新的私有上下文,这个上下文可能被释放,也可能不被释放,不论是否被释放,它的作用是:

  1. 保护:划分一个独立的代码执行区域,在这个区域中有自己私有变量存储的空间,而用到的私有变量和其它区域中的变量不会有任何的冲突(防止全局变量污染)
  2. 保存:如果上下文不被销毁,那么存储的私有变量的值也不会被销毁,可以被其下级上下文中调取使用
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不会

浏览器的垃圾回收机制(自己内部处理):

  • [谷歌等浏览器是“基于引用查找“来进行垃圾回收的]
  1. 开辟的堆内存,浏览器自己默认会在空闲的时候,查找所有内存的引用,把那些不被引用的内存释放掉
  2. 开辟的栈内存(上下文)一般在代码执行完都会出栈释放,如果遇到上下文中的东西被外部占用,则不会释放
  • [IE等浏览器是“基于计数器”机制来进行内存管理的]
  1. 创建的内存被引用一次,则计数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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值