美文网首页
js 闭包 函数执行完后会干什么

js 闭包 函数执行完后会干什么

作者: IamaStupid | 来源:发表于2020-07-07 16:48 被阅读0次

先看一段代码:

<script type="text/javascript">
...
function outer () {
  let a = 123;
  function inner () {
    console.log(a);
  }
  inner();
}
outer();
let bb = 1;
...
</script>

这段代码执行完outer(),理论上outer函数作用域下的内存就销毁了,再也不存在了,所以outer函数作用域内的变量再也访问不了。
(严格来说,当函数运行到这段代码块结尾后,对应的执行上下文被弹出 stack 执行栈,等待引擎回收器回收分配出去的内存)
但outer函数并不会被销毁(因为这段代码中outer函数属于全局上下文,只要全局上下文没销毁,全局上下文里面的变量是不会被销毁的),所以还是可以再次执行outer函数的,再次调用的时候,outer函数所有变量回到初始状态(代码重新跑一遍)
如果修改一下代码:

function outer () {
  let a = 123;
  let b = {a: a}
  function inner () {
    console.log(a);
  }
  return inner;
}
var ob = outer();
let bb = 1;
...

执行完outer函数后,给全局作用域下的ob赋值inner函数,由于script下的代码属于全局作用域,在页面销毁之前,全局作用域下的变量是不会销毁的,所以即便所有代码执行完毕,ob也不会被销毁,从而被引用inner函数也不会被销毁,所以outer函数作用域也不能销毁,这样,回收机制就无法回收outer函数作用域分配出去的内存,导致内存泄漏。

上面的那种情况ob就是闭包,但如果outer函数return b 对象,你就不能说对象b形成了一个闭包。

JavaScript中的函数才会形成闭包。 闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量。

那闭包内存溢出的问题怎么可以解决? 用完ob之后,设置ob = null 这样就可以了。

复杂的版本:
https://www.jianshu.com/p/0aed3c135a1c
https://www.jianshu.com/p/f58c030182b4

相关文章

  • js 闭包 函数执行完后会干什么

    先看一段代码: 这段代码执行完outer(),理论上outer函数作用域下的内存就销毁了,再也不存在了,所以out...

  • 2019前端面试题

    闭包:JS中,提供了一种"闭包"的概念:在函数内部,定义一个子函数,可以用子函数访问父函数的私有变量。执行完操作以...

  • 关于逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包当函数执行过程中,执行的函数内部的闭包,...

  • 3.逃逸闭包,非逃逸闭包

    逃逸闭包:当函数执行结束后,才去调用函数内部的闭包,叫做逃逸闭包非逃逸闭包:当函数执行过程中,执行的函数内部的闭包...

  • js闭包

    1、js的闭包 执行完 var c = a()后,变量c实际指向函数名b,再执行 c()会alert(1)[第一次...

  • JavaScript闭包学习笔记

    @(JS技巧)[闭包] JavaScript闭包学习笔记 什么是闭包? 有些情况下,函数调用完成之后,其执行上下文...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • JS_闭包其实很简单

    JS_闭包其实很简单 闭包其实就是一个函数,执行以后,接受里面返回的函数,然后保存到一个全局变量中。要理解闭包,首...

  • 前端面试题(持续补充)

    js,node.js基础: 闭包 闭包是能够读取其他函数内部变量的函数。在js中,只有函数内部的子函数可以访问内部...

  • 闭包的理解。

    js的垃圾回收机制 当一个函数执行完,js引擎会回收不再使用的内存,闭包通过这个作用域的引用,阻止了垃圾回收。 什...

网友评论

      本文标题:js 闭包 函数执行完后会干什么

      本文链接:https://www.haomeiwen.com/subject/nqfzqktx.html