美文网首页
变量、作用域、内存

变量、作用域、内存

作者: Viewwei | 来源:发表于2022-05-16 16:20 被阅读0次

    原始值和引用值

    JavaScript主要是包含两种数据类型,即原始值和引用值。原始值就是简单的数据类型,ES中包含6种,undefined、null、number、string、boolean、symbol。引用值就是由多种类型定义。
    原始值和引用值的定时方式类似。都是创建一个变量,然后给它赋值。在变量保存之后,可以做什么就不相同了。引用值可以随意的增删改查属性和方法,但是原始值就不行。在编码的时候虽然能够对原始值变量增删改查,而且不会报错。但是在执行的时候,所有对原始值的操作都是无效的。这是因为原始本身是不可以修改的。在修改的时候,JavaScript引擎会首先创建一个值来保存原始值,然后创建一个相应的包装对象来存储这个值,但是不会对原始值的增删改查属性操作进行装箱操作。所有原始值的动态操作都是无效的。
    原始值和引用值在复制的时候也不同。原始值会被复制到新变量的地址位置,引用对象只是改变新属性的地址。
    原始值和引用值在传递参数的时候也表现的不同,ES中所有的函数都是按值传递的,,这意味着函数外的值会被复制到函数内部的参数,就像一个变量从另外一个变量复制一样。如果是原始值,那么就跟原始值变量被复制一样,如果是引用值,那么就和引用值一样。在按值传递的时候,值会被复制到一个局部变量(arguments)中

    执行上下文与作用域

    变量或者函数的上下文决定了它们可以访问哪些数据,以及他们的行为。每个上下文都有一个关联的变量对象全局上下文是最外层的上下文,在浏览器中,全局的上下文就是window对象。每个函数都有自己的上下文。当代码执行流进入函数,函数的上下文被推到一个上下文栈上,在函数执行完成之后,上下文栈会弹出改函数的上下文,将控制权返还给之前的上下文。上下文的代码在执行的时候,会创建变量对象的一个作用域。这个作用域决定了各级上下文中的代码访问变量和函数时的顺序。代码正在执行的上下文的变量始终位于作用域的最前端。

    垃圾回收

    JavaScript使用的是垃圾回收语言。JavaScript引擎通过内存管理实现内存分配和闲置资源回收。简单来说就是哪些资源不用了就回收哪些资源,然后释放其内存资源。垃圾回收目前使用有两种方式:标记清理和引用计数:JavaScript目前使用的是标记。当变量进入上下文,比如函数内部申明一个变量,这个变量会被加上存在上下文的标记,而在上下文中的变量,在逻辑上来说,永远不应该被释放掉,这是因为其代码正在被运行,当变量离开上下文的时候,也会被加上离开标记。引用计数其思路就是对每个值都记录它被引用的次数。申明变量并赋值,这个变量的引用为1,如果保存的变量被其他值覆盖,则减1.但是引用计数在两种情况有致命的问题,第一就是对象之间的循环引用。导致变量的引用计数始终不为1,从而导致无法释放。第二中就是在JavaScript对象和DOM对象相互引用的时候,如果DOM元素已经删除,但是Dom元素被JavaScript对象引用,从而无法释放掉dom元素

    相关文章

      网友评论

          本文标题:变量、作用域、内存

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