闭包不一定要传一个参数进去,但是要引用一个局部变量,我们通过闭包把它传出来赋给全局变量,以使它在调用完之后还一直存在作用链域中,所占的内存空间不会被释放掉。下面的代码就是一个闭包。每一次调用才c(),o的值都会递增。如果b()没有引用o,那么每一次调用a()时o的值都为0。var c = null; //定义全局变量c function a(){ //定义函数a var o = 0; //定义函数a的局部变量o function b(){ //定义函数a的嵌套函数b o++; //引用外围函数a的局部变量o,并自加 return o; //函数b返回o的值 } return b; //函数a返回其嵌套函数b } c = a(); //将调用函数a的结果赋给了全局对象c,此时c = b c();
function a(){ //定义函数a
var o = 0; //定义函数a的局部变量o
function b(){ //定义函数a的嵌套函数b
o++; //引用外围函数a的局部变量o,并自加
return o; //函数b返回o的值
}
return b; //函数a返回其嵌套函数b
}
c = a(); //将调用函数a的结果赋给了全局对象c,此时c = b
c();
window.onload=function(){
var div=document.getElementsByTagName("div");
for(var i=0;i<div.length;i++)
{
div[i].onmouseover=(function(i){
return function(){
div[i].style.borderColor="red";
}
})(i),我想问的是这边的i一定要传进去吗??i不是全局变量吗?
div[i].onmouseout=(function(i){
return function(){
div[i].style.borderColor="blue";
}
})(i)
}
}
var str = "111";function f1(){
alert(str);
}function f2(){
var str = "222";
f1();
}f2();
var str = "111";function f2(){
var str = "222";
function f1(){
alert(str);
}
f1();
}f2();
在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。