1、关于变量,个人通俗的理解:变量在JavaScript中,是一种容器,用于存储临时数据.
<详情请看 javaScript数据类型 变量命名规范>
代码如下:
<script type="text/javascript">
var nZ=6;
varnQ=8;
varnE=nZ+nQ;
</script>
通过代码段我们可以看到 我将6的值存储到nZ变量中,将8赋值给nQ中,然后将nZ和nQ的值加起来赋值给nE 如果最后我们弹出nE的话 alert(nE); 将会得到14.
2、变量的命名规范(五项)
2.1、 变量命名可以是字母a-z/A-Z(大小写字母开头) 或_(下划线) 与$(美元符号)起始.
//如oLi2 _aBtn $oBox (通常都不使用_ $下划线或者$美元符)
2.2、变量命名的字符长度不允许超过255个字符且变量命名中间不允许有空格.
//使用正确的命名长度:如循环中用一个字符,如i ;或j; 条件和循环变量用一个单词,方法名1-2个单词,类名2-3个单词,全局变量3-4个单词.变量名要使用 有意义的名称,通过变量名能大概反映出其具体的用途.
2.3、变量命名首个字符不允许为数字.
// 如:8oTxt (这是错误的命名!需要注意) 但是能在字母追加数字如: oLi2 (这是正确的)
2.4、 变量不能使用计算机脚本语言中预留的关键字,及其保留字.
//如javascript中预留的:true,false,while,case,break保留字等
2.5、 JavaScript中大小写敏感so(大写字母的变量与小写字母的变量是两个不同的变量)
//如 oB 与ob 是两个不同的变量
自己常犯的命名错误及
3、变量的声明方法
1、 匈牙利命名法.该命名法是在每个变量名的前面加上若干表示数据类型的字符.基本原则是:变量名=属性+类型+对象描述.如n表示number,所有n开头的变量命都表示number类型.o表示object,所有变量命以o开头的都表示object对象类型变量.
2、骆驼命名法.正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字.驼峰命名法跟帕斯卡命名法相似,只是首字母为小写,如userName。因为看上去像驼峰,因此而得名。
3、帕斯卡命名法 即pascal命名法.做法是首字母大写,如UserName,常用在类的变量命名中.
<变量声明和函数声明要提前 先声明再用!>
4 局部变量 <在函数内定义的变量为局部变量>
在方法内定义的变量称为“局部变量”或“临时变量”,方法结束后局部变量占用的内存将被释放。
当局部变量与全局变量重名时,起作用的是局部变量<就近原则!>。
5 全局变量 <在所有函数外定义的变量即为 全局变量>-------在函数内直接使用未声明的变量 则为 全局变量.如 num=600;
全局变量,又称“外部变量”,它不是属于哪个方法,作用域从定义的地址开始到源文件结束。
代码如下:
<script type="text/javascript">
//全局变量最好少用或不用,以免重名 出错
var a=5; //声明变量a 属于全局变量,声明后所有的函数内都可以使用 定义在所有函数的外部
function aa(){ //声明函数aa()无参函数
var a=66; //局部变量,只有在函数aa中才能使用,函数的使用 就近原则。
alert(a); //弹出变量a的值 弹出的值是66
}
aa(); //调用函数
</script>
6 关于闭包(closure):
6.1 javascript中闭包的特性
6.1.1函数嵌套函数
6.1.2子函数内部可以引用父函数的参数和变量
6.1.3参数和变量不会被垃圾回收机制回收
6.2 如何定义闭包及闭包的优缺点:
6.2.1闭包是指子函数使用父函数的局部变量,子函数通过访问和使用父函数的局部变量.
6.2.2闭包也有缺点,使用完后不释放就会一直存在,且占据内存增大内存使用量,使用不当就会造成内存泄露.
6.2.3闭包是js脚本语言的一大特征,闭包的主要作用是:使得对象拥有私有的方法和变量 且使得变量一直存在与内存中.同时还可以避
免关于全局变量与局部变量的错误.
6.2.4函数一般情况执行完毕后就会被垃圾回收机制回收,且占用的内存中只保存函数的作用域,但闭包与此截然不同!
子函数使用父函数的变量代码如下:
function num() {
var i = 1;
return function(){
alert(i++);
};
}
var fun = num();
fun();//第一次执行后 a++,得到1
fun();//第二次执行后 a++,得到2
fun = null;//a被回收!!
从上面我们可以看到闭包会使变量始终保存在内存中<方便接下来使用>,如果不当的使用会增大内存消耗甚至造成内存泄露.
6.3 垃圾回收编辑 简称GC(Garbage Collection):JAVA/.NET中的垃圾收集器.
Java是由C++发展来的.它摈弃了C++中一些繁琐容易出错的东西。其中有一条就是这个GC.而C#又借鉴了JAVA.
在js中同样适用
6.3.1关于js的垃圾回收
1)、在js中,果一个对象不再被引用,那么这个对象就会被GC回收;
2)、如果两个对象互相引用,而不再被第三者所引用,那么这两个互相引用的对象也会被GC给回收.
6.4 关于js闭包占用内存的释放
代码如下>实现累加后并释放占用内存:
//使用匿名函数实现局部变量驻留内存中,从而实现累加
<script type="text/javascript">
function oBox(){
var nNum = 100;
return function(){ //匿名函数
nNum++;
return nNum; //将内部结果返回!
};
}
var a = oBox();
alert(a()); //即alert(oBox()());
alert(a());
alert(a());
alert(a); //---最后弹出上面申明的匿名函数 return function(){nNum++; return nNum;};
a = null; //让变量a为空 解除引用,等待GC垃圾回收
</script>
6.5关于使用后的内存泄露<解决办法>
代码如下:
由于IE的js对象和DOM对象使用不同的垃圾收集方法,因此闭包在IE中会导致内存泄露问题,也就是无法销毁驻留在内存中的元素
function count(){
var oDiv = document.getElementById('oDiv');//oDiv用完之后一直驻留在内存中
oDiv.onclick = function () {
alert('oDiv.innerHTML'); //这里用oDiv导致内存泄露
};
}
count();
function count(){
var oDiv = document.getElementById('oDiv');
var test = oDiv.innerHTML;
oDiv.onclick = function () {
alert(test);
};
oDiv = null; //最后应将oDiv为空使内存避免泄露
}
使用闭包必须注意的地方:
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法
是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部
变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。