今天的码农女孩做了关于闭包的练习 2022/1/7

1. function f5() {

        f=ff();

        return f;

        function ff() {

            return "f" in window;

        };

        var f;

    }

    console.log(f5());

解释:f5是全局下的函数,但是ff是函数下的私有函数,是一个闭包,验证f是否属于window,返回false,所以f再返回给f5函数之外,则是输出是false

--------------------

  2. var a = 9;

    function ss() {

        a = 0;

        return function (b) {

            return b + (a++)

        }

    }

    var f = ss();

    var m = f(5);

    console.log(m);

    var n = ss()(5);

    console.log(n);

    var x = f(5);

    console.log(x);

    console.log(a);

解释:函数体内a=0,但是没有var声明,所有全局变量a变成了0,这是一个闭包,return b + (a++)是后++就变成了5+0,所有第一个m输出5;第二个原理和第一个一样所以n输出5;但是f(5)已经被调用过一次所以a的值没销毁,return b + (a++)是后++就变成了5+1,所以x输出6;原先a=0,但是被调用两次,所以a输出2.

--------------------

3.var aa=20;

function bind() {

    var aa=12;

    function fn() {

        console.log(this.aa);

    }

    box.οnclick=function () {

        fn();

    }

}

box.onclick();

解释:bind和fn形成闭包,全局变量aa=20,局部变量aa=12,fn调用的应为局部变量下的aa,所以输出12;box绑定的点击事件无法在函数外执行,所以报错。

--------------------

4.  function fn(b) {

        console.log(b);

        if(1!=2){

            console.log(b);

            function b() {

                console.log(b);

            }

            b();

            console.log(b);

        }

        console.log(b);

        b()

    }

fn(1);

解释:因为fn(1),将形参b赋值成1,所以第一次输出1;if(1!=2)结果为true,function在内存中完成了声明和定义,所以第二次输出函数体;当调用b(),第三次输出是函数体;第四次输出还是在if里最后执行输出的也是函数体;因为最后输出的是fn()的b,在if外函数执行完毕会自动销毁,所以输出b的值为1,调用b()没有函数了,所以报错。

--------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值