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

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 变量、作用域和内存问题)