一般来说函数内部可以访问函数外部的变量,但外部不能访问函数内部的变量。
如果想让一个函数访问另一个函数内部的变量,这就需要闭包函数。简单来说,实现闭包就是函数嵌套函数。
有三种方式:
1.调用函数。例:
function a(){
var n = 1;
function b(){
console.log("n:",n);
}
b();
}
a();
2.返回值
function a() {
var x = 1;
return function () {
console.log("x:", x);
}
}
a()();
3 .自调用
function a() {
var x = 1;
(function () {
console.log("x:", x);
})()
}
a();
闭包在定时器传参时的使用
定时器直接循环会出现以下问题:
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
结果如下:
可以使用let(块级作用域)解决传参问题:
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
结果如下:
也可以使用闭包来解决:
for (var i = 0; i < 5; i++) {
function a(m) {
setTimeout(() => {
console.log(m);
}, 1000 * m);
}
a(i);
}
结果如下: