背景
最近有如下一道题目,大家可以看看,可以自己先试图分析分析里面涉及到哪些知识点
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)