JavaScript内存管理和闭包

在学习Js的时候,永远都绕不开闭包这一个话题,它很难吗?其实好像也就这样吧!
PS:个人总结,如有错误请指正噢!❤swift翻译

内存管swift代码

️认识内存管理

  • 任何语言都会在代码执行的过程中,去分配个各自的内存,不同的语言在内存管理方面是不一样的。
  • 无论什么方法管理内存,内存的管swift翻译理都会有如下的生命周期
    • 第一步:分配申请你需要的内存(申请)
    • 第二步:使用分配的内存(存放一指针式万用表些东西,比如对象等)
    • 第三步:不需要javascript面试题使用时,对其进行释放
  • 不同的语言对于第一步和第三步会有不同的实现
    • 手动管理内存比如C、C++
    • 自动管理内存:比如Java、JavaScrippython安装教程t、Python、Swjavascript高级程序设计ift、Dart等,它们有自动帮助我们管理内存
  • JavaScript通常情况是不需要手动管理的javascript百炼成仙免费阅读

JavaScript的内存管理

  • JavaScript会在定义变量时为我们分配内存
    • JavaScript对于基本数据类型内存的分配会在执行时,直接在栈空间进行分配
    • JavaScript对于复杂数据类型内存的分配会在堆内存中开辟一块空间,并且将这块空间的指针返回值变量引用

什么?你居然不知道JavaScript的闭包是什么?

JavaScript的垃圾回收

  • 因为内存的大小是有限的,所以当内存不再需python编程要的时候,我们需要对其进行释放,以便腾出更多的内存空间
  • 现代的编程语言都是有自己的垃圾回收机制
    • 垃圾回收的英文是Garbage Collectpython安装教程ion,简称GC;
    • 对于那些不再使用的对象,我们都称之为是垃圾,它需要被回收,以释放更多的内存空间;
    • 而我们的语言运行环境,比如Java的运行环境JVM,JavaScriptswifter的运行环境js引擎都会内存 垃圾回收器;
    • 垃圾回收器我们也会简称为GC,所以在很多地方你看到GC其实指的是垃圾回收器;
  • GC怎么知道哪些对象是不再使用的呢? –> GC算法

常见的GC算法 – 引用计数

  • 引用计数:
    • 当一个对象有一个引用指向它时,那么这个对象的引用就+1,当一个对象引用为0時,这个对象就可以被销毁掉
    • 指针式万用表使用方法个算法有一个很大的弊端就是会产生循环引用

这时候就出现了循环引用,解决方法其实也很简单就是将属性置为空

// 循环引用
var obj1 = {name: Agility , friend: obj2}
var obj2 = {name: Agility2 , friend: obj1}
// 解决
obj1.friend = null 

常见的GC算法 – 标记清除

  • 标记清除:
    • 这个算法是设置一个根对象(root object),垃圾回收器会定期从这个根开始,找所有从根javascriptdownload开始有引用到的对象,对于哪些没有引用到的对象,就认为是不可用的对象
    • 这个算法可以很好的解决循环引用的问题;

什么?你居然不知道JavaScript的闭包是什么?

  • JSswift代码引擎比较广泛的采用的就是标记清除算法,当然类似于V8引擎为了进行更好的优化,它在算法的实现细节上也会python怎么读结合一些其他的算法。

JavaScript闭包

❓让我们来看看MDN是如何定义闭包的吧.
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(cjavascript高级程序设计losure)。也就是说,闭包让你可以python可以做什么工作在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包指针万用表读数图解就会在函数创建的同python是什么意思时被创建出来.

嗯…好像很复杂哇..复杂吗?

来look一下这个代码

function foo() {
  function bar() {
    console.log(bar);
  }
  return bar
}
var fn = foo()
fn()

执行过程

什么?你居然不知道JavaScript的闭包是什么?
那么这和闭python是什么意思包有啥关系呢? 再look一下下面的代码

function foo() {
  var name = "foo"
  function bar() {
    console.log("bar" , name);
  }
  return bar
}
var fn = foo()
fn()

执行过程

什么?你居然不知道JavaScript的闭包是什么?

闭包是两部分组成的:函数+可以访问javascriptdownload的自由变量


再来看看维基百科是如何定上下文什么意思义闭包的吧

  • 是在支持头等函数的编程语言中,实指针说漫现词法绑定的一种技术
    • 头等函数:Js的函数是一等公民
    • 词法绑定:在解析这个函数的时候就会确定它的上层作用域,这个步骤就在词法javascript什么意思解析的时候进行的
  • 闭包在Python实现上是一个结构体,它存储了一个函数和指针c语言一个上下文英语关联的环境(相当于一个符号查找表)
  • 闭包跟函数最swift国际结算系统指针万用表怎么读数的区别在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样即使脱离了捕捉时的上下文,它也能照常运行
    • 自由变量会在捕捉时被确定,其实就是name

总结

  • 一个普通的函数function,如指针万用表怎么读数果它可以访问swift语言外层作用域的自由变量,那么这个函数就是一个闭包
  • 从广义的角度来说:JavaScript中的函数都是闭包(因为都是可以访问的)
  • 从狭义的角度来说:JavaScript中一个函数,如果访问了外层作用域的变量才叫闭包

为何AO没有被销毁呢?

上一个案例中,在执行完后,foo的AO对象理应被销毁,为什么它没有呢?

function foo() {
  var name = "foo"
  function bar() {
    console.log("bar" , name);
  }
  return bar
}
var fn = foo()
fn()

什么?你居然不知道JavaScript的闭包是什么?

现在明白了指针万用表读数图解什么AO为什么没有被销毁python安装教程了吧~

闭包产生的内存泄露python是什么意思

来想想一个问题,ba联系上下文r函数对象(0xb00)一直没有被销毁,就是等于foo的AO对象也没有被销毁,相当于bar函数对象和foo的AO一直占据着内存空间。

这个就是称为内存泄漏

function foo() {
  var name = "foo"
  function bar() {
    console.log("bar" , name);
  }
  return bar
}
var fn = foo()
fn()

如何解决呢?
其实把fn置为空就行了!

fn = null

什么?你居然不知道JavaScript的闭包是什么?

V8的细节

那么是不是foo的AO对象中所有属性都会保留呢?

function foo() {
  var name = "foo"
  var age = 18
  function bar() {
    console.log("bar" , name);
  }
  return bar
}
var fn = foo()
fn()

当执行到bar函数中,V8引擎会优化,把bar函数中没有使用的属性移除

什么?你居然不知道JavaScript的闭包是什么?

总结

  • JavaScript的内存管理
    • 垃圾回收机制 → 引用计数、标记清除
  • JavaScript的闭包
    • 什么是闭包? → 闭包是两部分组成的:函数+可以访问的自由变量
    • AO为何没有被销毁? → 没有被垃圾回收机制识别