作用域链

如何顺着作用域链寻找变量?

  1. 函数在执行过程中,先从自己内部找变量
  2. 如果找不到,再从 创建当前函数所在作用域 去找,以此往上

根据这个顺序,我们来看三道题目及解析:

var a = 1
function fn1(){
  function fn2(){
    console.log(a) //fn2()内部作用域没有变量a, 只能从创建fn2()的作用域中找,找到var a=2
  }
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //输出2
var a = 1
function fn1(){
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
function fn2(){
  console.log(a) //fn2()内部作用域没有变量a, 只能从创建fn2()的作用域中找,找到var a=1
}
var fn = fn1()
fn() //输出1
var a = 1 // 第一步
function fn1(){

  function fn3(){
    function fn2(){
      console.log(a) //fn2()内部作用域没有变量a, 只能从创建fn2()的作用域中找
                    //找到var a,但未赋值
    }
    var a //第五步
    fn2() //第六步
    var a = 4  // 此语句被忽略
  }
  var a = 2 //第三步
  return fn3 //第四步
}
var fn = fn1() //第二步
fn() //输出undefined

你可能感兴趣的:(作用域链)