这里我们根据之前介绍的闭包延伸一下其他的知识点。
在闭包中,其保存的是整个变量对象。闭包只能取得包含函数中任何变量的最后一个值。下面举个栗子:
以上整个函数createFn()执行后会返回一个result数组,表面上看result数组中的每个函数执行后会返回自己的索引值,例如0位置的函数返回0,1位置的函数返回1....,,实际上返回的都是10,。这是因为每创建的内部函数会将外部函数即createFn的活动对象添加到其作用域链上,所以它们引用的都是同一个变量i。所以当createFn函数返回后,i的值已经变为10了,所以内部函数所引用外部函数i的值也就是10了。如果要输出的是每个函数在数组中的下标,我们可以创建另一个匿名函数。如下:
关于this对象:this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。然而,匿名函数的执行环境是具有局限性,其this对象通常是指向window的。
由于闭包的编写,这一点可能有些不同:
当执行obj对象中getName方法返回出来的函数,猜猜会返回什么字符串。并不是"MY NAME",返回的是"WINDOW"。
这是因为,每个函数调用的时候都会去得到两个特殊的变量,this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象位置。因为不会访问其外部函数这个两个变量。如果把外部函数的this存到闭包能够访问到的变量里面,那么就可以让闭包访问该对象了。
this和arguments有同样的问题,那么就用同样的方法进行处理就好了。
内存泄漏:闭包在IE的这些版本中会导致一些特殊的问题。如果闭包的作用域链中保存一个HTML元素。那么就意味着这个元素无法被销毁。
以上函数创建了一个作为ele元素事件处理程序的闭包。这个闭包又引用了外部函数的一个变量ele,这就导致无法减少对ele的引用,只要匿名函数存在,那么就用于不会收回。
必须记住:闭包会引用包含函数的整个活动对象!!而并不是其中的某个变量或者dom元素。
--------以上根据javascript高级程序设计总结。