您的位置:首页 > Web前端 > JavaScript

javascript 闭包问题

2016-08-16 17:29 519 查看
函数的闭包:有权访问另一个函数作用域中的变量的函数。常见方式:在一个函数内部创建另一个函数。

function createComparisonFunction(propertuName){
return function(object1,object2){
var value1=object1[propertuName];
var value2=object2[propertuName];
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
};
}
闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象,而不是某个特殊的值。

function createFunction(){
var result=new Array();
for(var i=0;i<10;i++){
result[i]=function(){
return i;
};
}
return result;
}
var funcs = createFunction();
for (var i=0; i < funcs.length; i++){
document.write(funcs[i]() + "<br />");
}

createFunction()函数返回一个数组。表面上看,似乎每个函数都应该返回自己的索引值,但事实并非如此,事实上每个函数的返回值都是10.因为每个函数的作用域链中都包含着createFunctions()函数的活动对象,所以它们引用的都是同一个变量i。当createFunctions()函数返回后,变量i的值就是10,此时每个函数都引用着保存变量i的同一个变量对象,所以每个函数返回后都是10。

创建另一个匿名函数:

function createFunction() {
var result = new Array();
for(var i = 0; i < 10; i++) {
result[i] = function(num) {
return function() {
return num;
};
}(i);
}
return result;
}
var funcs = createFunction();
for(var i = 0; i < funcs.length; i++) {
document.write(funcs[i]() + "<br />");
}


在重写了前面的createFunction()函数后,每个函数就会返回各自不同的索引值了。在这里,我们没有直接把闭包赋值给数值,而是定义了一个匿名函数,并将立即执行该函数的结果赋值给数组。这里的匿名函数有一个参数num,也就是最终的函数要返回的值。在调用每个匿名函数时,我们传入了变量i。由于函数参数按值传递的,所以就会将变量i的当前值复制给参数num。而在这个匿名函数内部,有创建并返回了一个访问num的闭包。这样依赖,result数组中的每个函数都有自己num变量的一个副本,因此就可以返回各自不同的数值了。

闭包的作用:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

function f1() {    
var n = 9;	    
Add = function() {
n += 1
}	    
function f2() {      
alert(n);    
}	    
return f2;	  
}  
var result = f1();  
result(); // 9 
Add();  
result(); // 10
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。一般将其设置为null可以删除。

function assignHandler(){
var element=document.getElementById("someElement");
var id=element.id;
element.onclick=function(){
alert(id);
};
element=null;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: