`

【javascript编程模式】之变量声明的技巧

阅读更多

一,我们的习惯

 

	// 普通变量
	var a = 1 * 2;

	// 对象变量

	var obj1 = new Object();

	var obj2 = {}; // 快捷方式

	var obj3 = {
		property1 : "我是属性1",
		property2 : "我是属性2",
		function1 : function() {
			alert("obj3的函数");
		},
		function2 : function(param) {
			alert("有参函数");
		}
	};

	// 数组变量

	var arr1 = new Array();

	var arr2 = [ 1, 2, 3, 4, 5 ];// 快捷方式

	var arr2 = [ 1, 2, [ 1, 2, 3, 4, 5 ], 4, 5 ];// 快捷方式

	// map类型

	var map = {
		title : "标题",
		logo : "/logos/welcome.png",
		age : 20,
		sex : "男"
	};

	// 函数变量
	var f = function() {
		alert("我是函数变量,给我一对括号吧");

	};

	// 匿名函数变量
	// 这里的函数名fact 是为匿名函数起的一个名字,近供自身调用,一般用于递归
	var f = function fact(x) {
		if (x <= 1)
			return 1;
		else
			return x * fact(x - 1);
	};
 

二,如何去改善代码

 

 这里我们要用到匿名函数,当然其他函数也可以,

 

 

1,什么是匿名函数

 

 匿名函数就是一个无名称的类函数的表达式!

 

 

  •  无参匿名函数,与函数的区别是:没有函数名

 

       function(){

           alert("我是一个匿名函数,没有参数");

      }

 

 

  • 有参匿名函数,与函数的区别:没有函数名

     var fn=function(param){

 

           alert("我是一个匿名函数,有参数"+param);

      }

 

  •     有名字的匿名函数,与函数的区别:注意这个名字,仅自身可用,其他地方无法引用,并且必须有一个左值

      var fn=function increase(num){

         if(num>100){

       return;

         }else{

             increase(++num);

         }

     }

 

2,原理:在函数内的变量,其作用域范围为当前函数内,函数执行完毕,变量失效。如果想设置全局变量,将其暴露出去即可

 

 

(function(window){
	var _common={};
	_common.faxbox={
			
		modified:false,
		
		_emailList:false,
		
		emailList:function(){
			if(this._emailList){
				return this._emailList;
			}
			this._emailList= zk.Widget.$(jq("$emailList"));
			return this._emailList;
		},
		
		eachFaxList:function(callback){
			var itemInter =this.emailList().itemIterator() ;
			while(itemInter.hasNext()){
				callback.apply(this,[itemInter.next()]);
			}
		},
		
		switchReadStatus:function(listitem,status){
			var statusLabel =listitem.firstChild.firstChild;
			var readImage =listitem.firstChild.nextSibling.firstChild.firstChild;
			var arr =statusLabel.getValue().split(":");
			if(arr[1]!=status){
				this.modified=true;
			}else{
				listitem.setSelected(false);
				return;
			}
			arr[1]=status;
			statusLabel.setValue(arr.join(":"));
			switch(status){
				case 0:
					readImage.setSrc("/icon/images/email_unread.png");
					break;
				case 1:
					readImage.setSrc("/icon/images/marktrans.png");
					break;
				case 2:
					readImage.setSrc("/icon/images/email_replied.png");
					break;
				case 3:
					readImage.setSrc("/icon/images/email_forward.png");
					break;
				case 4:
					readImage.setSrc("/icon/images/email_forwardReplied.png");
					break;
				default:
					break;
			}
		},
		
		switchColorStatus:function(listitem,status){
			var statusLabel =listitem.firstChild.firstChild;
			var arr =statusLabel.getValue().split(":");
			if(arr[3]!=status){
				this.modified=true;
			}else{
				listitem.setSelected(false);
				return;
			}
			arr[3]=status;
			statusLabel.setValue(arr.join(":"));
			var listcell =listitem.lastChild.previousSibling.previousSibling;
			var subjectCell = listcell.nextSibling;
			switch(status){
			case 1://红色
				jq(subjectCell).attr("style","color: #ff3747 !important;font-weight:;"); 
				listcell.setImage("/icon/images/mark1.gif");
				break;
			case 2://绿色
				jq(subjectCell).attr("style","color: #29dd3d !important;font-weight:;"); 
				listcell.setImage("/icon/images/mark2.gif");
				break;
			case 3://橙色
				jq(subjectCell).attr("style","color: #ffa127 !important;font-weight:;"); 
				listcell.setImage("/icon/images/mark3.gif");
				break;
			case 4://蓝色
				jq(subjectCell).attr("style","color: #36d1ff !important;font-weight:;"); 
				listcell.setImage("/icon/images/mark4.gif");
				break;
			case 5://粉色
				jq(subjectCell).attr("style","color:#ffb7d7  !important;font-weight:;"); 
				listcell.setImage("/icon/images/mark5.gif");
				break;
			case 6://青色
				jq(subjectCell).attr("style","color: #85dfd2 !important;font-weight:;"); 
				listcell.setImage("/icon/images/mark6.gif");
				break;
			case 7://黄色
				jq(subjectCell).attr("style","color: #e2c462 !important;font-weight:;"); 
				listcell.setImage("/icon/images/mark7.gif");
				break;
			case 8://紫色
				jq(subjectCell).attr("style","color: #ed50f8 !important;font-weight:;"); 
				listcell.setImage("/icon/images/mark8.gif");
				break;
			case 9://灰色
				jq(subjectCell).attr("style","color: #a1a3a4 !important;font-weight:;"); 
				listcell.setImage("/icon/images/mark9.gif");
				break;
			default:
				jq(subjectCell).attr("style","color:;font-weight:;"); 
				listcell.setImage("/icon/images/marktrans.png");
				break;
			}
		},
		selectAll:function(){//选择所有邮件
			this.emailList().selectAll(false,null);
		},
		endMarkStatus:function(){
			
			if(this.modified)return;
			
			//1停止处理框
			
			zk.endProcessing();
			//2,提示用户
			
			jq.alert("您选择的邮件已经是当前状态,无需再次标记。",{title:"选择邮件出错"});
			
			//3停止事件的传播,阻止调用后台代码
			jq.stop();
		},
		checkSelect:function(){
				if(this.emailList().getSelectedItems().length){
					jq.alert("请选择邮件!",{title:"选择邮件出错"});
					
					jq.stop();
				}
		},
		_select:function(status){
			this.eachFaxList(function(listitem){
				var rsLabel = listitem.firstChild.firstChild;
				if(rsLabel.getValue().split(":")[1]==status){
					listitem.setSelected(true);
				}else{
					listitem.setSelected(false);
				}
			});
		},
		
		selectUnRead:function(){
			this._select("0");
		},
		
		selectRead:function(){
			this._select("1");
		},
		
		selectReplied:function(){
			this._select("2");
		},
		
		selectForwarded:function(){
			this._select("3");
		},
		
		selectRF:function(){
			this._select("4");
		},
		
		selectInvert:function(){
			this.eachFaxList(function(listitem){
				if(listitem.isSelected()){ 
					listitem.setSelected(false);
				}else{
					listitem.setSelected(true);
				}
			});
		},
		
		clearSelected:function(){
			this.emailList().clearSelection();
		},
		
		markReaded:function(){
				this.checkSelect();
				zk.startProcessing(1);
				this.eachFaxList(function(listitem){
					if(listitem.isSelected()){ 
						this.switchReadStatus(listitem,1);
					}
				});
				this.endMarkStatus();
		},
		
		markUnReaded:function(){
			this.checkSelect();
			zk.startProcessing(1);
			this.eachFaxList(function(listitem){
				if(listitem.isSelected()){ 
					this.switchReadStatus(listitem,0);
				}
			});
			
			this.endMarkStatus();
		},
		
		markColor:function(status){
			this.checkSelect();
			zk.startProcessing(1);
			this.eachFaxList(function(listitem){
				if(status==-1){
					this.switchColorStatus(listitem,status);
				}else if(listitem.isSelected()){ 
					this.switchColorStatus(listitem,status);
				}
			});
			this.endMarkStatus();
		},
		markLevel:function(level){
			if(!(level==-1||level==0||level==1))return;
			this.checkSelect();
			zk.startProcessing(1);
			this.eachFaxList(function(listitem){
				if(!listitem.isSelected()){ 
					return;
				}
				var statusLabel =listitem.firstChild.firstChild;
				var arr =statusLabel.getValue().split(":");
				if(arr[2]!=status){
					this.modified=true;
				}else{
					listitem.setSelected(false);
					return;
				}
				arr[2]=level;
				statusLabel.setValue(arr.join(":"));
				var levelImage =listitem.firstChild.nextSibling.firstChild.lastChild;
				switch(level){
					case -1:
						levelImage.setSrc("/icon/images/level3_mini.png");
						break;
					case 0:
						levelImage.setSrc("/icon/images/level2_mini.png");
						break;
					case 1:
						levelImage.setSrc("/icon/images/level1_mini.png");
						break;
				}
			});
			this.endMarkStatus();
		}
	};
	
	
	jq(window).blur(function(){
		_common.win.isFocus=false;
	});
	
	
	jq(window).focus(function(){
		_common.win.isFocus=true;
	});
	
	_common.win={
			isFocus:true
	};
	//暴露common
	window.common=_common;
	
})(window);
 

三,为什么要这么做?

 

1, 首先我们来比较一下(一)和(二)中变量的作用域

 

   (一)声明的所有变量均为全局变量,(二)中,我们仅仅暴露了一个全局变量common(当然,如果你原因可以像mootools那样基于package概念,common.util.stringUtil,comm.util.*)

 

 

2,然后我们看一下,(一)中声明带来的问题

 

(一)中变量的声明散落到任何地方,当我们团队开发项目的时候,不同的开发人员声明的变量或函数可能相同,

因为是全局的,所以会产生冲突问题,浏览器在执行js的时候,同名函数或变量,最后一个将覆盖以前所有同名的变量或函数

举个例子:

 

张三声明了一个全局变量

 

var myName="张三";

 

 

而李四呢,他也声明了全局变量

 

var myName="我是李四";

 

 

 

然后他们两个在项目中的不同模块  向 客户问好!

 

function sayHello()

{

       alert("你好,我是"+myName);

}

 

张三这样说了:

 

<button onclick="sayHello()"></button>

 

李四这样说了:

 

<img onclick="sayHello()" src="/welcome.png"></img>

 

 

但是客户看到的问候来自谁的呢??

 

可能是张三,也可能是李四。

 

如果张三和李四声明了同名函数,但是函数体的具体实现不同,那么张三和李四在使用这个函数时,自以为调用了自己声明的函数,但始终未达到自己想要的效果,或者说代码做了他无法挽回的事情,那么后果就灰常严重了,

 

 

 

 

 

四,总结

 

前几天在看jQuery源码和JavaScript: The Definitive Guide, 5th Edition,学到许多js优化以及js面向对象编程的方法,语言的诞生自有它存在的价值。

 

本文主要介绍如何避免全局变量及全局函数冲突,我们使用面向对象的方法解决冲突问题,其中借鉴了jQuery和mootools的一些技巧

 

 

 

 

 

 

 

 

 

 

 

 

2
1
分享到:
评论

相关推荐

    javascript指南和函数式编程

    《Effective JavaScript(中文版).pdf》这本书是JavaScript编程的经典之作,它包含了68个具体的实践建议,涵盖了语言的基础到高级特性。每个建议都通过实例来解释,旨在提高代码的质量和效率。书中的知识点包括但不...

    JavaScript动态网页编程

    本压缩包“精通JavaScript动态网页编程(实例版)”包含了深入理解和实践JavaScript编程所需的各种资源,特别是对于想要提升动态网页设计能力的学习者来说,极具价值。 JavaScript的核心知识点包括以下几个方面: ...

    Javascript模块化编程详解

    本文将深入讲解JavaScript模块化编程的基础和一些进阶技巧。 基础部分: 1. **匿名闭包**:JavaScript中的匿名闭包是一种基础的模块化工具。它通过一个立即执行的函数表达式(IIFE)创建一个私有作用域,保护内部...

    JS技巧——日常常用JAVASCRIPT脚本

    - `var`, `let` 和 `const`:在ES6中,我们有了新的变量声明方式。`var` 是传统的全局或局部变量,而 `let` 和 `const` 是块级作用域,其中 `const` 用于声明不可变常量。 - 类型转换:JavaScript是弱类型语言,...

    javascript 高级编程

    通过阅读博客(如链接所示)和实践这些高级主题,开发者可以提升自己的JavaScript编程能力,从而在实际项目中实现更高效、更健壮的代码。学习JavaScript高级编程,不仅有助于提升个人技术水平,也有助于在团队协作和...

    JavaScript编程的10个实用小技巧

    JavaScript编程中的实用技巧可以极大地简化开发过程,提高代码效率,同时也能够增强我们对于这门语言的理解和运用。以下是根据给定文件内容整理出的JavaScript编程的10个实用小技巧。 首先,关于变量转换,建议始终...

    包含javascript的基础语法,面向对象的实现和设计模式实现-javascript.zip

    综上所述,这份压缩包资源将帮助学习者全面理解JavaScript的基础知识,掌握面向对象编程技巧,并了解如何在实际项目中应用各种设计模式。通过深入学习和实践,开发者可以编写出更加高效、可维护的JavaScript代码。

    百例JavaScript技巧

    "百例JavaScript技巧"这个主题覆盖了各种实用的JavaScript编程技巧,旨在帮助开发者提升技能,提高工作效率。以下是根据这个主题可能会涵盖的一些关键知识点: 1. **基础语法**:JavaScript的基础包括变量声明(var...

    一套基于纯js实现的JavaScript典型应用技巧例子源码

    1. **基础语法**:JavaScript的基础包括变量声明(var、let、const)、数据类型(如字符串、数字、布尔值、null、undefined、对象、数组、函数等)、操作符(算术、比较、逻辑、位运算等)以及流程控制(条件语句、...

    JavaScript技巧200多个

    这个名为"JavaScript技巧200多个"的资源显然包含了大量实用的编程技巧,可以帮助开发者提升JavaScript编程效率和代码质量。以下是一些可能包含在JS技巧200个.txt文件中的关键知识点: 1. **变量声明与作用域**:...

    精通JavaScript动态网页编程(实例版)

    JavaScript是Web开发中不可或缺的一部分,尤其在构建动态网页时,其重要性不言而喻。本书“精通JavaScript动态...同时,书中提供的源码分析和调试技巧也将帮助读者更好地理解和解决问题,成为JavaScript编程的专家。

    JavaScript 使用技巧.md

    在 JavaScript 中,使用 `const` 声明只读变量和使用 `let` 声明可变变量是一种最佳实践。这有助于防止意外的全局变量污染,并提高代码的可维护性。 **示例代码:** ```javascript const PI = 3.14; // 只读变量 ...

    javascript经典实例源码

    1. **基础语法**:JavaScript的基础包括变量声明(var、let、const)、数据类型(字符串、数字、布尔值、null、undefined、对象、数组、symbol)、条件语句(if...else、switch)和循环结构(for、while、do...while...

    Object-oriented-javascript

    ”中,我们可以提取出关于面向对象JavaScript编程的知识点。这本书由Stoyan Stefanov所著,出版于2008年,由Packt Publishing出版。Stefanov是一位有经验的Yahoo!网络开发者、Zend认证工程师以及书籍作者。他还是一...

Global site tag (gtag.js) - Google Analytics