内存释放和作用域销毁

(一)垃圾回收/内存释放

引用数据类型,比如两个对象

var obj1 = { name: '张三' }
var obj2 = obj1

在内存中存储的方式是这样的

引用地址存在栈中,具体的值存在堆中

// 赋值为null 说明指针失效
var obj1 = null
console.log(obj1, obj2)
// obj1 -> null 
// obj2 -> { name: 'zhangsan' }
// obj2 的指针仍然指向原来的值的内存

此时 xxxfff000 这个内存空间仍有 obj2 在指针指向,所以不能销毁

var obj1 = null
var obj2 = null
console.log(obj1, obj2)

 全部都指向null , 也就是说两者都没有指针了,目前 xxxfff000 这个内存空间,没有人用了

一旦没有人使用了,浏览器就会在他空闲的时候,把这个堆内存空间销毁掉(这就是 垃圾回收,也叫内存释放)

(二)栈内存

栈内存分为【全局作用域】 和 【函数作用域】

全局作用域:浏览器页面打开创建,页面关闭的时候,全局作用域销毁

函数作用域:一个函数执行会新成一个函数作用域,当函数中的代码执行完成后,当前函数作用域会主动进行释放和销毁。执行完作用域销毁

函数作用域:执行一个创建一个,执行完成就销毁,一个函数调用1000次,最后剩余的作用域就是 0 个,这样有利于性能的优化~性能比较好

但还是存在特殊的情况:

当函数作用域中的部分内存被作用域以外的东西占用了, 那么当前的这个作用域就不能被销毁了,通常有一下几种情况:

(1)函数返回了一个引用数据类型的值,并且该值在函数的外面被其他的东西接收了,这种情况下,形成的函数作用域不会销毁

function fn () {
  var num = 100
  return function () {
    num++
  }
}

var fish = fn()

fn 执行之后不销毁~

(2)返回的函数执行,不立即销毁

function fn () {
  var num = 100
  return function () {
    num++
    console.log(num)
  }
}

fn()()

返回的引用的值执行,执行一次后销毁。不立即销毁~

(三)作用域的题

function fn () {
  var i = 10
  return function (n) {
    console.log(n + (++i))
  }
}

var f = fn()
f(10) // 21
f(20) // 32

fn()(10) // 21
fn()(20) // 31

解答:

// 赋值之后共享一个i
var f = fn()
f(10) // 21
f(20) // 32
// 各自有各自的i,不共享
fn()(10) // 21
fn()(20) // 31

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值