您当前的位置: 首页 > 学无止境 > JS经典实例 网站首页JS经典实例
javascript学习笔记-变量作用域及内存
发布时间:2018-04-05 17:49:56编辑:雪饮阅读()
基本类
型值有以下几种:Undefined、Null、Boolean、Number 和 String
在某些语言中, 字符串以对象的形式来表示,例如java, 因此被认为是引用类型。 ECMAScript
放弃这一传统。
如果赋值的是引用类型的值, 则必须在堆内存中为这个值分配空间。 由于这种值的大小
不固定, 因此不能把它们保存到栈内存中。 但内存地址大小的固定的, 因此可以将内存地址
保存在栈内存中。 这样, 当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地
址找到堆中的值。对于这种,我们把它叫做按引用访问
基本类型按值访问,引用类型按引用地址访问
参数传递不按引用传递(不影响原值)
function sum(num){
//这里的 num 是局部变量,全局无效, 不影响全局变量
return num+=10;
}
var num=10;
alert(sum(num));
alert(num);
在php中默认也是不按引用传参,但是若使用了&符号则就采用了引用传参(影响原值)
<?php
function box(&$num){
$num+=10;
return $num;
}
$num=0;
echo box($num);
echo "<br/>";
echo $num;
?>
instanceof关键字
typeof虽然可以检测一个变量的类型,但是typeof检测正则、对象、数组时候会发现结果都是object,因为它们都属于object的子实例。如果要判断具体是不是某个类型的变量,只需要使用instanceof关键字和待检测的变量类型名称即可
var box=[1,2,3];
var box2={};
var box3=/\d/;
//判断是否属于数组
alert(box instanceof Array);
//判断是否属于对象
alert(box2 instanceof Object);
//判断是否属于正则
alert(box3 instanceof RegExp);
需要注意的是:instanceof不能直接用于检测普通的非引用的变量,除非该变量是通过new方式创建的,如var box=new String('ddd');这种方式才可以正常检测,否则返回检测结果为false
内存问题
JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使
用的内存。其他语言比如 C 和 C++,必须手工跟踪内存使用情况,适时的释放,否则会造
成很多问题。而 JavaScript 则不需要这样,它会自行管理内存分配及无用内存的回收。
JavaScript 最常用的垃圾收集方式是标记清除。垃圾收集器会在运行的时候给存储在内
存中的变量加上标记。 然后, 它会去掉环境中正在使用变量的标记, 而没有被去掉标记的变
量将被视为准备删除的变量。 最后, 垃圾收集器完成内存清理工作, 销毁那些带标记的值并
回收他们所占用的内存空间。
垃圾收集器是周期性运行的,这样会导致整个程序的性能问题。比如 IE7 以前的版本,
它的垃圾收集器是根据内存分配量运行的,比如 256 个变量就开始运行垃圾收集器,这样,
就不得不频繁地运行,从而降低的性能。
一般来说, 确保占用最少的内存可以让页面获得更好的性能。 那么优化内存的最佳方案,
就是一旦数据不再有用,那么将其设置为 null 来释放引用,这个做法叫做解除引用(相当于做了待清理的标记)。这一
做法适用于大多数全局变量和全局对象。
var o = {
name : 'Lee'
};
o = null; //解除对象引用,等待垃圾收集器回收
关键字词:javascript,变量,作用域,内存