闭包
- 一个函数的声明,即创建了一个闭包,函数创建自己的作用域,同时有一个指向全局变量(作用域链的顶层)的引用,函数可以访问自己内部的变量,也可以按照作用域链的层级一次向上访问外部的变量
- 闭包可以访问外部变量
- 闭包内部声明的变量和方法,在闭包外部不能访问
- 外部函数包含一个内部函数,当内部函数使用了外部函数定义的私有变量时,即内部函数的函数作用域产生了一个closure,其中包含了内部函数对外部函数变量的所有引用,只要内部函数存在,这些引用就不会被销毁,同样,外部函数在存活期间对自己的变量进行的任何修改,都会反映到内部变量的引用上。
经典问题:
<body>
<p>alert(0)</p>
<p>alert(1)</p>
<p>alert(2)</p>
</body>
以上代码点击时输出相应的0-2
方法一:
var arr = document.getElementByTag('p');
for(var i=0; i < arr.length; i++) {
(function (j) {
arr[j].onclick = function () {
alert(j)
}
})(i)
}
方法二:
for(var i=0; i<arr.length; i++) {
arr[i].arg = i;
arr[i].onclick = function () {
alert(this.arg);
}
}
方法三:
for(var i=0; i<arr.length; i++) {
arr[i].onclick = (function (arg) {
return function () {
alert(arg);
}
})(i)
}
闭包的作用
- 可以在函数的外部访问函数内部变量
- 保存函数内部的变量在内存中
问题
- 过度使用闭包会造成内存占用过多