作用域

35 阅读1分钟

题目

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了)

后记

如果看不懂上面的某些内容,说明你的函数作用域还没有过关。

你所不知道JS函数作用域