什么是闭包?
- 首先我们可以通过一段代码清晰地展示所谓的闭包
function foo() {
var a = 2;
function bar() {
console.log( a );
}
return bar;
}
var baz = foo();
baz(); // 2
在foo()执行后,其返回值(也就是内部的bar()函数)赋值给变量baz并调用baz(),实际上只是通过不同的标识符引用调用了内部的函数bar(),即bar()虽然可以被正常执行,但是在其自身词法作用域以外的地方被调用了 ** 在foo()执行后,其内部作用域理应被销毁,用以释放不再使用的内存空间,但是由于bar()函数仍然持有对该作用域的引用,使得内部作用域没有被销毁,而这个引用就叫做闭包 **
闭包终极形态(强化理解)
function test() {
var arr = []
for(var i = 0; i<10; i++){
(function(j) {
arr[j] = function() {
console.log(j);
}
})(i)
}
return arr
}
var myArr = test()
for(var j = 0;j < 10; j++) {
myArr[j]()
}
在这段代码中,首先是执行一个对于“i”的for循环然后就是一直到i为10,然后就是一直把i的值付给j,不过到i为9的时候,就会终止循环,不过此时i已经为10,但j还是为9,因为数组function(j)一直在调用test()的词法作用域,所以就产生了闭包,所以最后把test()对象付给数组myArr是,每次都是输出function(i)循环是,i的值,即0,1,2,3,4,5,6,7,8,9没错就是这样