js闭包~![[5]]

啥是闭包?

这个玩意儿很有用!!

为啥要有面相对象~?

还有函数式编程哦~  

js好强大


且看分析:

<script> 
/*
	下面例子形成了一个 "环境包"  但是别人访问不到 age=20 这个。

	下面这个例子,  t2 接受了一个包  一个环境包  t2是有生态环境的

	主要在于 return t2  -----> t2 把 环境包捕捉
*/
function t1(){
	var age = 20;
	function t2(){
		alert(age);
	}
	return t2;
}

var tmp = t1();

var age = 99;
tmp();


</script>


取决于声明的时候 不取决于调用的时候


例子:

<script> 
/*
	// {函数的作用于取决于声明的时候, 不取决调用的时候!!!!}


	两个爸爸, 到底alert那个爸爸?


*/
function who_dad(){
	var dad = '我是第一个爸爸';
	var me = function (){
		alert(dad);
	}
	return me;
}


function run(){
	var dad = "我是第二个爸爸";
	var me = who_dad();
	me();
}


run();


</script>

闭包计数器:

(场景:多人都开发js,每调用一次自增一次)

1:设置一个全局的变量

如:

window.xx = yy;
window.xx ++;   // 但是缺点是,污染全局变量了,  都用引用自己的js 就妥了....
2:闭包来搞  (污染不到的变量)

<script> 

function cout(){
	var cnt = 0;
	function cen(){
		return ++cnt;
	}
	return cen;   // 返回内个包包
}
var cen = cout();   // 需要接受这个包包
alert(cen());     // 调用
alert(cen());     // 调用
alert(cen());     // 调用

</script>
精简:

// 一  返回包


(function (){
	var cnt = 0;
	return function(){
		return ++cnt;
	}
})();

// 二  接收包  完成
var cen = (function (){ 
	var cnt = 0;
	return function (){
		return ++cnt;
	}
})();
alert(cen());
alert(cen());
alert(cen());

重要:

/*
三、依然是全局变量,解决:
	1. 统一放在一个全局变量上面 如->jquery->$
	2. 用每个人自己的命名空间
*/
// 1 放在jquery的计数器
var $ = {};
$.cnt =( function (){
	var cnt = 0;
	return function(){
		return ++cnt;
	}
})();
alert($.cnt());
alert($.cnt());
alert($.cnt());
alert($.cnt());


// 2 个人命名空间
var zp = {};  // 说清,zp是我的空间
zp.cnt = (function(){
	var cnt = 0;
	return function (){
		return ++cnt;
	}
})();
alert(zp.cnt());
alert(zp.cnt());
alert(zp.cnt());
alert(zp.cnt());



最后一个测试题目:


	
	<ul>
		<li>one</li>
		<li>three</li>
		<li>four</li>
		<li>five</li>
	</ul>


<script> 

/*
	导航栏, 有四个
	然后想给效果,  然后for来添加click事件

单击分别淡出 1 2 3 4
*/

var li = document.getElementsByTagName('li');
for(var i=0;i<li.length;i++){
	li[i].οnclick=function(){
		alert(i);
	}
}


// 结果 4 4 4 4 

</script>

答案:

(复制下面哦~)
















var li = document.getElementsByTagName('li');
for(var i=0;i<li.length;i++){
	li[i].xxoo = i;	
	li[i].οnclick=function(){		
		alert(this.xxoo);
	}
}


// 函数式

var list = document.getElementsByTagName('li');
var len = list.length;
var i = 0;

for (i; i < len; i++) {
    (function (n) {
        list[n].onclick = function () {
            alert(n);
        };
    })(i)
}






发布了10 篇原创文章 · 获赞 0 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章