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,即为解除变量
网友评论