一道题目解析知识点

187 阅读2分钟

背景

最近有如下一道题目,大家可以看看,可以自己先试图分析分析里面涉及到哪些知识点

    var a = 0,b = 0;
    function A(a){
        A = function(b){
            console.log(a+b++)
        }
        console.log(a++)
    }
    A(1) // 输出是多少
    A(1) // 输出是多少

分析

一元操作符 a++ 与 ++a 的区别

  • 一元操作符号,是唯一个改变自身的运算符
  • ++a ,操作符在左侧,会先返回 ++ 的结果
  • a++ ,操作符再右侧,会先返回 自身原来的值,最后再进行 ++ 计算
var a = 1,b=1;
console.log(a++)  // 结果1  因为 a++,返回a的原始值,然后再计算 ++
console.log(a)    // 结果2 
console.log(++b)  // 结果2  因为 ++b,先计算 ++ ,再返回值

闭包的理解

闭包就是能狗拿到函数内部的变量的函数,上面的哪里是闭包呢

console.log(a+b++) => 其中 a 就是那个函数内部的变量, A = function(){},就是闭包了 (只是此处的A 和 外面的函数名字一样了而已)
    // 上面的等价于
    function D(a){
       console.log(a++)
       return function(b){  // 注意必须有return 否则不算
            console.log(a+b++)  // a 就是闭包内变量,
        }
    }
   let A = D(1)
   A(1)

变量作用域的理解

  • 因为 A 首先是 外面的函数的名字,在内部有用A = xxx,此时,相当与 把 外面的函数 给换了(再执行完 外部的函数之后 A的内存地址就变了,A就是另外一个函数)
  • 函数的传参,实际上就是xxx(a)等价与 xxx(let a =1) a相当于函数内部的一个变量,结果 A的替代函数内部又到了 a,相当于 形成了 闭包函数

等价函数

    // 上面的等价于
    function D(a){
       console.log(a++)
       return function(b){  // 注意必须有return 否则不算
            console.log(a+b++)  // a 就是闭包内变量,
        }
    }
   let A = D(1)
   A(1)