javaScript

76 阅读2分钟

⭐⭐变量、作用域与内存

上下文

每个上下文都存在一个变量对象,而这个上下文中定义的所有变量和函数都存在这个对象上,无法通过访问到这个对象,但后台数据确实用到它。

上下文在其所有代码执行完毕后会被销毁,(全局上下文在应用程序退出前才会被销毁,比如关闭网页。)

执行上下文分全局上下文、函数上下文和块级上下文。

作用域链

上下文中的代码在执行中,会创建变量对象的一个作用域链。代码正在执行的上下文的变量对象始终位于作用域链的最前端。

作用域链增强

某些语句会导致在作用域链前端临时添加上下文,这个上下文在代码执行后会被删除。

try/catch语句的catch块

with语句

这两种情况下,都会在作用域链前端添加一个变脸对象,with会向作用域链前端添加指定的对象,对catch会创建一个新的变量对象,这个对象包含抛出的错误

⭐⭐垃圾回收机制

标记处理

当变量进入相应的上下文中时,会被做一定标记,当变量离开相应上下文会被添加离开上下文的标记。当垃圾回收机制运行时,就会将这些不需要的变量删除。

引用计数

记录每个值被引用的次数,如果一个值被赋给另一个变量时,那么引用数加1,如果该值引用的变量被其他值覆盖时,减1,当引用数为0时,垃圾回收机制便可删除该值的内存。

严重bug循环引用

对象a有一个指针指向对象b,对象b也引用了对象a,意味着他们的引用数都是2,永远都不会被释放。

避免循环引用的bug,可以程序最后将相应的变量值设置为null

⭐⭐性能

如果不需要的变量设置null,解除引用

通过let跟const命名,因为有块级作用域,能让变量尽早被回收。