JavaScript闭包浅解

《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-------------------------------')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值