JavaScript中处理全局变量

js如何避免变量冲突

/* 
		1.解决js冲突方法一 
		用匿名函数将脚本包起来,改变变量的作用域 让变量的作用域控制在匿名函数之内
	 */
		(function(){
			var str = "hello world!";
			alert(str);
		})();
	/* 
		1.解决两个匿名函数之间通信
		使用全局变量 在window作用域下定义全局变量但是也应该要控制全局变量的个数
		使用普通变量作为全局变量,扩展性就会很差,可以使用一个对象类型的变量作为全局变量
		如果需要很多全局变量作通信,则可以将这些变量都作为全局变量的属性
 	*/
		var GLOBAL = {};
		(function(){
			GLOBAL.str = "hello world2!";
			alert(GLOBAL.str);
		})();
	/*
		2.解决变量命名冲突
	 	全局变量属性如果命名简单极有可能被无意中覆盖
	 	可以使用命名空间解决这个问题 只不过为了避免被覆盖多嵌套了一次对象比如
	 */

	 (function(){
	 	GLOBAL.A = {};
	 	GLOBAL.A.name = "alice";
	 	alert(GLOBAL.A.name);
	 })();

	 /*
		3.还可以多级使用
	 */
	  (function(){
	 	GLOBAL.B = {};
	 	GLOBAL.B.DATE = {};
	 	GLOBAL.B.DATE.year = 2016;
	 	GLOBAL.B.DATE.month = 4;
	 	alert(GLOBAL.B.DATE.month);
	 })();
	</script>
 	<script>
	/*
		4.定义命名空间函数
		这样可以在命名空间中的匿名函数调用,多级非常方便
	 */
	 var GLOBAL = {};
	 GLOBAL.namespace = function(str){
	 	var arr = str.split("."),o = GLOBAL;
	 	for(i = (arr[0] == "GLOBAL") ? 1 : 0;i < arr.length; i++){
	 		o[arr[i]] = o[arr[i]] || {};
	 		o = o[arr[i]];
	 	}
	 }
	 GLOBAL.namespace("CLASS.PER");
	 GLOBAL.CLASS.PER.name = "lefeier";
	 console.log('GLOBAL : ' + GLOBAL);
	 alert(GLOBAL.CLASS.PER.name);
	</script>
	
	<script>
		/* 5.程序统一入口 
		window.onload 所有资源全部下载完毕之后才执行
		DOMReady 只要页面所有的节点全部加载完成即可 它并不是原生js事件 但是很多的js框架提供这种事件 */


		/* 6.JavaScript分层概念
		   1. base层  
		   封装不同浏览器下js的差异,提供统一接口 
		   抚平DOM EVENT 事件冒泡 onXXX、attachEvent addEventListener 自定义函数
		   2. common层
		   提供可以复用的组件
		   3. page层
		   完成页面内的功能需求
		 */

		 // 部分base层的方法

		 /* 封装阻止事件冒泡 */
		 function stopPropagation(e){
		 	e = window.event || e;
		 	if(document.all){/* IE */
		 		e.cancelable = true;
		 	}else{
		 		e.stopPropagation();
		 	}
		 }
		 /* 封装事件绑定 */
		 function on(node, eventType, handler){
		 	node = typeof node == "string" ? document.getElementById(node) : node;
		 	if(document.all){
		 		node.attachEvent("on"+eventType, handler); //现在的IE版本已经抹平了不同
		 	}else{
		 		node.addEventListener(eventType, handler, false);
		 	}
		 }
		 var btn = document.getElementById("btn");
		 on(btn,"click",function(){
		 	alert("button clicked!");
		 });

		 /* 获取含有指定class名的指定页面元素 */
		function getClass(tagname, className) { //tagname指元素,className指class的值
         //getElementsByClassName用下面的方法
         var tagname = document.getElementsByTagName(tagname);  //获取指定元素
         var tagnameAll = [];     //这个数组用于存储所有符合条件的元素
         for (var i = 0; i < tagname.length; i++) {     //遍历获得的元素
            if (tagname[i].className.split(" ")[0] == className) {
            //如果获得的元素中的class的值是于指定的类名,就赋值给tagnameAll
                tagnameAll[tagnameAll.length] = tagname[i];
                }
            }
           return tagnameAll;   
    	}
 /* getElementsByClassName 兼容处理 */
        function getElementsByClassName(ele, className){
        	if(ele.getElementsByClassName){
        		return ele.getElementsByClassName(className);
        	}else{ //IE 7 8 
        		var elements = ele.getElementsByTagName('*');
        		var result = [], element;
        		for(var i = 0, element = elements[i]; i <  elements.length;i++){
        			if(hasClass(elements[i], className)){
        				result.push(elements[i]);
        			}
        		}
        		return result;
        	}
        }
        function hasClass(ele, className){
			var classNameStr = ele.className;
			classNameStr = classNameStr.trim();
			className = className.trim();
			var classItms = classNameStr.split(' ');
			for(var i = 0; i < classItms.length; i++){
				if(className === classItms[i])return true;
			}
			return false;
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值