题目
var a = 0;
var b = 0;
function A(a) {
A = function (b) {
console.log(a + b++)
}
console.log(a++)
}
A(1); //1
A(2); //4
考点
- js作用域链的理解(全局作用域和函数作用域)
- ++a,a++两种方式的区别
解读代码
A(1) 调用
- 第(1、2)是js的预处理机制
- 第(5)函数赋值会先在函数作用域内找A变量,但是没有找到,就向全局作用域找,找到了函数名为A这个函数,并且赋给函数名A新的函数,重置了函数A
- 第(6)在输出a时,先会在函数作用域找,找到了参数a,就不会往上找
- 第(6)a++ 是先处理输出再让a自加
A(2) 调用
在A(1)调用之后,函数A已经被重新赋值了,变成了function (b) {console.log(a + b++)},我们就称这个函数为B吧
- 第(8)因为A函数在执行A(1)时已经被修改了,所以执行的全新的函数
- 第(9)在js代码编译时就确定了作用域的范围。因为函数B是在A里面定义的,使用B中找不到a变量,就会往A找(疑惑A为什么还没有结束?涉及到作用域销毁机制),在A中就找到了变量a(当前为2了)
后记
如果看不懂上面的某些内容,说明你的函数作用域还没有过关。