一道js题目引起我对闭包和自增运算符的深刻反思

97 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

前言

今天没有写博客没有什么思路,于是决定去刷下js题目,做一个题目解析. 错题如下:

image.png

image.png

1.首次错误思路

  • (1).首先定义了一个test立即执行函数,这个函数是一个嵌套函数,函数内部还有一个函数
    • 里面的函数访问了外部的变量i,初步判断,这道题目要考察闭包的知识,
    • 闭包的作用是可以使变量生命周期变长,并且内部的函数可以访问外部变量

image.png

  • (2).之后是一个for循环
    • 初始值i为0,循环次数为20,i最终值为20

image.png

  • (3).最后控制台输出test()

    • test()输出的是sum,由于在for循环中执行了20词,并且闭包中变量生命周期变长不会被回收
    • 所以num应为20,num++为21
    • 所以最终输出的应为20,num结果为21
  • 所以我选D:21,20

image.png

2.本题正确思路

  • (1).首先定义了一个test立即执行函数,这个函数是一个嵌套函数,函数内部还有一个函数
    • 里面的函数访问了外部的变量i,初步判断,这道题目要考察闭包的知识,
    • 闭包的作用是可以使变量生命周期变长,并且内部的函数可以访问外部变量

image.png

  • (2).之后是一个for循环
    • 初始值i为0,循环次数为20,i最终值为20

image.png

  • (3).最后控制台输出test()

    • test()输出的是sum,由于在for循环中执行了20次,并且闭包中变量生命周期变长不会被回收
    • 所以num应为20,num++为21
    • 同时后++运算符是先用后加,
    • 所以最终输出的应为21,num结果为20
  • 答案为B:20,21

image.png

3.实际调试一下

        var test = (
            function () {
                var num = 0;
                return () => {
                    return num++
                }
            }()
        );
        for (var i = 0; i < 20; i++) {
            test()
        }
        console.log(test())
  • 输出结果为20 image.png

4.反思总结

4.1闭包

  • 目的:内部函数引用外部的函数的变量,使变量不被回收,生命周期变长
  • 实现形式:嵌套函数

4.2自增运算符(前++和后++的区别)

  • 目的:都是使某一变量自己增加1,如果独自一行,则没有区别,如for循环中作为循环值时没区别
  • 不同
  • 前++,变量先加1,后参加操作,
  • 后++,变量先进行操作,再加1.