先说javascript匿名函数吧:
javascript匿名函数的创建形式:
1、var double = function(x){
return 2*x
}(2) //创建函数完毕之后又把函数付给变量double
2、(function(x,y){
alert(x+y)
})(2,3) //第一括号中创建了一个匿名函数,第二括号传入两个参数,调用该匿名函数
3、function(x,y){
alert(x,y);
}(2,3) //省略了前面的括号
在创建闭包的时候,常常会用到匿名函数,除此之外,匿名函数还可以用于构建命名空间,减少全局变量的使用。
闭包,可以说是函数的嵌套,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕;
看看代码:
var mEven = {};
(function(){
var addEvent = function(){};
function removeEven(){}
mEven.addEvent = addEvent;
mEven.removeEven = removeEven;
})();
(function(){
var addEvent = function(){};
function removeEven(){}
mEven.addEvent = addEvent;
mEven.removeEven = removeEven;
})();
通过全局变量mEven来调用两个局部变量,减少了全局变量的使用。
写道
var outer = null;
(function(){
var one = 1;
function inner(){
one += 1;
alert(one);
}
outer = inner;
})();
outer(); //2
outer(); //3
outer(); //4
(function(){
var one = 1;
function inner(){
one += 1;
alert(one);
}
outer = inner;
})();
outer(); //2
outer(); //3
outer(); //4
局部变量one外部不可以访问,但是可以被inner函数访问,将inner函数指向了outer,那么调用outer,outer 每次递增
闭包允许内层函数引用父函数的变量,但是该变量是最终值
var ps = document.getElementsByTagName("P");
for(var i=0;i<ps.length;i++){
function(){
ps[i].onclick = function(){
lert(i);
}
}
}
始终弹出最后一个索引
可以这样写:
var ps = document.getElementsByTagName("P");
//以参数的形式传递
/*for(var i=0;i<ps.length;i++){
(function(arg){
ps[i].onclick = function(){
alert("arg"+arg);
}
})(i);
}*/
//以局部变量的形式传递
for(var i=0;i<ps.length;i++){
(function(){
var temp = i;
ps[i].onclick = function(){
alert("temp "+temp);
}
})();
}