JavaScript作用域链

【JavaScript作用域链】大多数语言里面都会使用{}来形成一个作用域,俗称块级作用域。JavaScript中{}没有带来块级作用域,JavaScript的作用域是靠函数来形成的,也就是说一个函数内定义的变量,函数外不可以访问。

function fn() { var a =1; if(a > 2) { var b = 3; } console.log(b); } fn(); //undefined console.log(a); //输出undefined

有了作用域的概念,函数间的层层引用时,每个变量所属的作用域都是确定的,那同名的变量应该如何确定引用关系呢?比如:
var a = 1 function fn1(){ function fn2(){ console.log(a) } function fn3(){ var a = 4 fn2() } var a = 2 return fn3 } var fn = fn1() fn() //输出2

为什么最后输出是2?当某个函数被调用时,会创建一个执行环境及相应的作用域链。fn2执行时,作用域链是:fn2() -> fn3() -> window。fn2内部没有定义变量a,所以会从它声明的环境中查找,而不是调用的环境。所以找到的是var a = 2;
解密:
  1. 函数在执行的过程中,先从自己内部找变量
  2. 如果找不到,再从创建当前函数所在的作用域去找, 以此往上
  3. 注意找的是变量的当前的状态
    P.S. 声明提前在作用域下同样适用。复杂情况一定要考虑进去。

    推荐阅读