⭐⭐变量、作用域与内存
上下文
每个上下文都存在一个变量对象,而这个上下文中定义的所有变量和函数都存在这个对象上,无法通过访问到这个对象,但后台数据确实用到它。
上下文在其所有代码执行完毕后会被销毁,(全局上下文在应用程序退出前才会被销毁,比如关闭网页。)
执行上下文分全局上下文、函数上下文和块级上下文。
作用域链
上下文中的代码在执行中,会创建变量对象的一个作用域链。代码正在执行的上下文的变量对象始终位于作用域链的最前端。
作用域链增强
某些语句会导致在作用域链前端临时添加上下文,这个上下文在代码执行后会被删除。
try/catch语句的catch块
with语句
这两种情况下,都会在作用域链前端添加一个变脸对象,with会向作用域链前端添加指定的对象,对catch会创建一个新的变量对象,这个对象包含抛出的错误
⭐⭐垃圾回收机制
标记处理
当变量进入相应的上下文中时,会被做一定标记,当变量离开相应上下文会被添加离开上下文的标记。当垃圾回收机制运行时,就会将这些不需要的变量删除。
引用计数
记录每个值被引用的次数,如果一个值被赋给另一个变量时,那么引用数加1,如果该值引用的变量被其他值覆盖时,减1,当引用数为0时,垃圾回收机制便可删除该值的内存。
严重bug循环引用
对象a有一个指针指向对象b,对象b也引用了对象a,意味着他们的引用数都是2,永远都不会被释放。
避免循环引用的bug,可以程序最后将相应的变量值设置为null
⭐⭐性能
如果不需要的变量设置null,解除引用
通过let跟const命名,因为有块级作用域,能让变量尽早被回收。