JavaScript局部变量、全局变量、闭包

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个字符且变量命名中间不允许有空格.     

//使用正确的命名长度:如循环中用一个字符,如;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),这时一定要小心,不要随便改变父函数内部变量的值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值