01JS变量作用域
Posted 戒奢从简,起早贪黑,努力提升
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01JS变量作用域相关的知识,希望对你有一定的参考价值。
数据类型
基本类型:Number、String、Boolean等。
引用类型:Object、Array等。
内存的堆栈
栈内存:一般保存 基本类型数据 和 引用类型数据的地址
堆内存:一般保存 引用类型数据。
注:栈内存可以直接按值可以访问;访问堆内存,先访问栈内存里面的地址。
变量的比较
基本类型比较:主要比较 值 跟 类型
引用类型比较:只要地址不一致,就是false
值的复制
基本类型:a = b; //把b的 值 赋给a
引用类型:a=b; //把b的 地址 赋给a,只要地址里面的值发生变化,a和b都会发生变化
想要复制一份引用类型的数据(浅拷贝)
function(obj){ newObj = {}; for(var p in obj){ newObj[p] = obj[p]; } return newObj; }
参数的传递
参数的传递都是按值传递的。无论基本数据类型还是引用数据类型。
function setName(obj){ obj.name = ‘xm’; obj = {}; obj.name = ‘xx’; } var pp = {}; setName(pp); console.log(pp.name); //打印出xm
类型检测
instanceof:判断 左边对象 是否为 其右边类的实例
如:
var re = 123; re instanceof Number; //true。判断re是否为number的实例
变量作用域
全局作用域:定义在全局,作用在全局
局部作用域:如函数作用域,出了函数就访问不到
注意:js没有块级作用域。{ }
变量对象和作用域链
变量对象:如
var sex = 18; function a(){ var sex = 18; } //window对象sex、a === window.sex 、 window.a //a函数对象sex === a.sex
作用域链:如
var sex = 18; var name = xm; function a(){ var sex = 18; console.log(sex); //优先局部里面的变量 console.log(name); //若局部里面没有,则会查找全局变量 } //注意:作用域链里面可以访问外面,但是外面不能访问里面
延长作用域链:
var person = {}; person.name = ‘xm’; var score = 44; with(person){ //用with,给person做延长或修改 sex = ‘male’; //给person对象添加person.sex name = ‘bb’; //修改person.name score = 0; //person.score找不到,但在全局找到score,所以修改 } //尽量少用或者不用with
JS解析机制
预解析
(变量和函数同名,保留函数;函数和函数同名,保留后面的;)
1、找出window对象,所有的var,并令其等于undefined
2、找出window对象,所有的function,并令其等于函数本身
3、找出function对象,里面的var,并令其等于undefined
4、找出function对象,里面的function,并令其等于函数本身(若没有嵌套函数就跳过)
逐行解析
5、代码一行一行往下读,遇到function就跳过(遇到调用函数的语句,跳到该函数里面去)
如:
var name = ‘bb’; function rr(){ console.log(name); //这里的name不会跳到window对象外面,因为预解析时,函数里面已经有一个name,并且已经赋值为undefined var name = ‘yy’; }
console.log(name); //没有var的全局变量,预解析不到。所以会报错 name = ‘bb’;
<script type=”text/javascript”> console.log(a); //在这里会报错,因为预解析是解析完一个script,再去解析script </script> <script type=”text/javascript”> var a = ‘bb’; </script>
垃圾收集机制
//释放无用的数据,回收内存。js是自动收集的,object-c是手动收集的
自动收集:找出没用数据,打上标识,释放其内存,周期性执行。
标识无用数据的策略
标记清除:给所有的变量打上标记,去掉 环境中的变量,以及 被环境中引用的变量。
引用计数:跟踪每个值被引用的次数,当引用次数变成0时,就会被回收。
当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。
var xm = { name=’123′,age=’14’ }; //这样xm就是1
如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。
xm = {}; 或 xm = null; //这样就由原来的1再减1。1-1=0
注意:当循环引用时,a中带有b,b中带有a,引用计数就永远回收不到。(ie9以下的DOM采用的是引用计数策略,原生对象是标记清除策略,两种对象相互调用,可能产生循环计数)
内存管理
因为 web浏览器 分配到的内存 小于桌面应用程序的内存,所以没用的变量要及时处理。(适用于多数全局变量;局部变量离开就会清除,所以局部用不到)
如:
a = [… , … , … , …];
a = null; //当a数组用完了,之后不再需要时,就得手动清除内存
以上是关于01JS变量作用域的主要内容,如果未能解决你的问题,请参考以下文章