javascript的闭包和回调

1.闭包

闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。

直观的说就是形成一个不销毁的栈环境。

js闭包典型的运用场景就是计算器困境:

    function add() {
    var counter = 0;
    return counter += 1;
    }

    console.log(add())
    console.log(add())
    console.log(add())

如上面的代码本意是输出3,最终输出的确都是1,而如果把counter定义在add函数的父作用域,则会导致任何脚本都能修改counter的值而扰乱计算结果
因此,我们可以使用自我调用函数形成的私有作用域,来保存变量

   var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
    })();
    
    console.log(add())
    console.log(add())
    console.log(add()) 

以上代码执行结果为1,2,3 从而解决了这个问题

###2.回调
回调函数原理:一个函数被作为参数传递给另一个函数(在这里我们把另一个函数叫做“otherFunction”),回调函数在otherFunction中被调用。
回调函数并不会马上被执行。它会在包含它的函数内的某个特定时间点被“回调”

回调函数典型的运行场景就是获取异步函数的返回值
比如:

    function getSomething() {
        var r = 0;
        setTimeout(function() {
            r = 2;
        }, 10);
        return r;
    }
    function compute() {
        var x = getSomething();
        console.log(x * 2);
        return x * 2
    }
    compute();

上面的代码执行结果不是4,是0,这是因为异步方法在同步方法之后执行
想到得到异步方法的返回值就可以用到回调

    function getSomething(cb) {
    var r = 0;
        setTimeout(function() {
            r = 2;
            cb(r);
        }, 10);
    }
    
    function compute(x) {
        console.log(x * 2);
        return x * 2
    }
    getSomething(compute);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值