javascript 闭包问题
2016-08-16 17:29
519 查看
函数的闭包:有权访问另一个函数作用域中的变量的函数。常见方式:在一个函数内部创建另一个函数。
createFunction()函数返回一个数组。表面上看,似乎每个函数都应该返回自己的索引值,但事实并非如此,事实上每个函数的返回值都是10.因为每个函数的作用域链中都包含着createFunctions()函数的活动对象,所以它们引用的都是同一个变量i。当createFunctions()函数返回后,变量i的值就是10,此时每个函数都引用着保存变量i的同一个变量对象,所以每个函数返回后都是10。
创建另一个匿名函数:
在重写了前面的createFunction()函数后,每个函数就会返回各自不同的索引值了。在这里,我们没有直接把闭包赋值给数值,而是定义了一个匿名函数,并将立即执行该函数的结果赋值给数组。这里的匿名函数有一个参数num,也就是最终的函数要返回的值。在调用每个匿名函数时,我们传入了变量i。由于函数参数按值传递的,所以就会将变量i的当前值复制给参数num。而在这个匿名函数内部,有创建并返回了一个访问num的闭包。这样依赖,result数组中的每个函数都有自己num变量的一个副本,因此就可以返回各自不同的数值了。
闭包的作用:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
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; }
相关文章推荐
- 细品javascript 寻址,闭包,对象模型和相关问题
- JavaScript绑定事件时的闭包问题
- (Javascript) 猴子也明白 之 闭包超级入门 1 问题
- 举例详细说明javascript作用域、闭包原理以及性能问题
- javascript作用域、闭包原理以及性能问题
- javascript 避免闭包引发的问题
- JavaScript的闭包问题
- Javascript作用域、闭包原理以及性能问题
- Javascript作用域、闭包原理以及性能问题
- 举例详细说明javascript作用域、闭包原理以及性能问题(转)
- JavaScript动态事件以及闭包问题的解决
- JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
- JavaScript闭包-循环添加onfocus事件出问题
- 举例详细说明javascript作用域、闭包原理以及性能问题
- 举例详细说明javascript作用域、闭包原理以及性能问题
- 细品javascript 寻址,闭包,对象模型和相关问题
- javascript中的闭包循环变量只能取最后一个值问题
- javascript中运用闭包和自执行函数解决大量的全局变量问题
- Javascript作用域、闭包原理以及性能问题
- 从javascript的循环问题来看待闭包本质