《JavaScript高级程序设计》这样描述:
闭包是指有权访问另一个函数作用域中的变量的函数;
通俗来说,本质就是上级作用域内变量的生命周期,因为被下级作用域内引用,而没有被释放。就导致上级作用域内的变量,等到下级作用域执行完以后才正常得到释放。
常见的闭包问题如下:
// 测试1
console.log('测试1-----start-------------------------------')
function testFun01() {
var num = 6;
return function () {
var n = 0;
console.log(++n)
console.log(++num)
}
}
var getFun01 = testFun01();
getFun01(); // 1 7
getFun01(); // 1 8
console.log('测试1-----end-------------------------------')
console.log('测试2-----start-------------------------------')
function func(n, o) {
console.log(o);
return {
func: function(m) {
return func(m, n);
}
};
}
var a = func(0); // undefined
a.func(1); // 0
a.func(2); // 0
a.func(3); // 0
var b = func(0).func(1).func(2).func(3); // undefined 0 1 2
var c = func(0).func(1); // undefined 0
c.func(2); // 1
c.func(3); // 1
// 参考 https://www.cnblogs.com/xxcanghai/p/4991870.html
console.log('测试2-----end-------------------------------')
console.log('测试3-----start-------------------------------')
for (var i = 0; i < 5; i++) { // var改为let也能解决
setTimeout(() => {
console.log(i); // 1秒后打印5个5
}, 1000)
}
for (var i = 0; i < 5; i++) {
(function (j) {
setTimeout(() => {
console.log(j); // 1秒后同时打印 0 1 2 3 4
}, 1000)
})(i)
}
for (var i = 0; i < 5; i++) {
(function (j) {
setTimeout(() => {
console.log(j); // 每隔1秒分别打印 0 1 2 3 4
}, 1000*j)
})(i)
}
console.log('测试3-----end-------------------------------')