闭包(一)

来源:互联网 发布:品茗软件怎么用 编辑:程序博客网 时间:2024/05/05 09:43

闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数。

如要了解闭包,就需要了解作用域链,作用域链本质上是一个指向变量对象的指针列表,它只引用,但不实际包含变量对象。

function createFunctions(){var result = new Array();for (var i = 0; i < 10; i++){result[i] = function(){return i;};}return result;}var resultarr = createFunctions()
上面例子中,result数组的每一项都是一个匿名函数,当createFunctions()函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。换句话说,createFuctions()函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中,直到匿名函数被销毁后,createFunctions()的活动对象才会被销毁。如下例,匿名函数仍然能访问到其包含函数中变量i的值。
console.log(resultarr[1]);//function(){return i;}console.log(resultarr[1]())//10
但是在上例中,resultarr[1[()的值是10,而不是我们所期望的1。因为如前面所说,result数组中的每一项都是一个匿名函数,而这些匿名函数的作用域链其本质只是一个指针,不实际包含变量对象。所以,在createFunctions()函数中循环完毕后,i就已经被赋值为10,所以,数组中的每一项匿名函数被调用时,其函数中的i也都指向变量i,即10;要解决这个问题只需在为result[i]赋值匿名函数时,直接调用此匿名函数即可

function createFunctions(){var result = new Array();for (var i = 0; i < 10; i++){result[i] = function(){return i;}();}return result;}var resultarr = createFunctions()


原创粉丝点击