美文网首页
JavaScript 变量、作用域和内存问题

JavaScript 变量、作用域和内存问题

作者: wupf | 来源:发表于2016-03-11 16:57 被阅读0次

    1 基本类型和引用类型的值(注意“值”)

    ES 变量包含的值就两种,基本类型和引用类型,没有第三种

    1.1 动态属性

    其实呢,就是说“亲儿子”引用类型的值可以添加或者修改或者删除属性和方法,而“路上捡的”基本数据类型就不可以

    1.2 复制变量值

    亲儿子引用类型毕竟亲,复制变量相当于复制一个指针,指向同一个对象,变量其中一个,改了亲儿子们都会改变
    捡的就不一样了,复制就会复制一个新的值

    1.3 传递参数

    • ES 中所有函数的参数传值都是按值传递的
    • 基本类型的值在作为参数传递时会复制给一个局部变量
    • 引用类型是复制这个值在内存中的地址,在函数内部修改会反映到外部,巴特!重写对象的时候不会改变原来的值。
      function setname(obj){ obj.name="wu"; obj = new Object(); obj.name="li"; }; var person = new Object(); person.name="wu1"; setname(person); console.log(person.name);//wu

    脑残吧,这不就是按引用赋值么…

    1.4 检测类型

    基本类型->typeof
    引用类型->instanceof 判断什么类型的对象

    2 执行环境和作用域

    执行环境

    • 定义变量或者函数有权访问的其他数据有那些
    • 执行环境关联一个 变量对象,当前环境中所有的变量和函数都保存在这个对象中
    • 全局执行环境是最外围的执行环境,宿主不同,全局环境也不同。web浏览器中,window对象为全局环境
    • 当代码执行完毕时,环境被销毁,包括所有的变量和函数
    • 全局环境要到应用程序退出,(关闭网页浏览器等等啦)
    • 每个函数都有自己的执行环境,执行到该函数时,函数的环境会被推入一个环境栈中,执行完就踢出去,控制权再还给之前的执行环境

    作用域链

    简单点说,作用域链就是代码运行时一级一级的深入方法内部,函数或者方法有访问外部环境变量的权限

    2.1 延长作用域链

    意思是在作用域的前端临时增加一个变量对象,执行完后被移除,包括如下两种方式

    • try-catch 语句的catch块
    • with语句 并不推荐使用

    2.2 没有块级作用域

    对于在for,if的语句中定义的变量外部仍然可以访问

    • 声明变量:使用var声明变量后,变量会自动添加到最接近的环境中,函数内部的话就是局部环境,而没有使用var声明的变量会自动添加到全局环境中。

    • 查询变量:从局部环境层层往上查(也就是从作用域链的头部开始),遇到定义就停止。(对性能没有影响)

    3 垃圾收集

    • 标记清除
    • 引用计数

    js做的挺好,不需要手动来做,标记清除是指首先给在内存中所有变量加上标记,再去掉正在用的和用过的变量的标记,离开变量是则比较为离开,则清除。引用计数会导致循环引用,从而导致性能问题

    -管理内存: 占用比较大的全局变量和全局对象的属性,在使用完后可以设置为null,即为解除变量

    相关文章

      网友评论

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

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