JavaScript作用域与作用域链

作用域

JavaScript作用域是靠函数来形成的,也就是一个函数内定义的变量函数外不可以访问
不使用var会声明一个全局变量

作用域链

当代码在一个环境中执行时,会创建变量对象的一个作用域链。
作用域链的用途:是保证对执行环境有权访问的所有变量和函数的有序访问
作用域第一个对象始终是当前执行代码所在环境的变量对象,全局环境的变量对象是作用域链中的组后一个对象。

  • 函数在执行的过程中,先从自己内部找变量
  • 如果找不到,再从创建当前函数所在的作用域去找,以此往上
  • 注意找的是变量的当前状态
    示例
var color = "blue";
function changeColor(){
        var anotherColor = "red";
        function swapColors(){
                var tempColor = anotherColor;
                anotherColor = color;
                color = tempColor;
                // 这里可以访问color、anotherColor、tempColor
        }
        // 这里可以访问color、anotherColor,但不能访问tempColor
        swapColors();
}
// 这里只能访问color
changeColor();

作用域链图


作用域链.jpg

示例

var a = 1
function fn1(){

  function fn3(){
    function fn2(){
      console.log(a)
    }
    fn2()
    var a = 4
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //输出多少
//输出 undefined

解析: 在本例中先执行var a = 1,var fn = fn1(),进入function fn1(),执行return fn3,进入function fn3(),由于变量声明前置,先执行var a,在执行fn2(),进入function fn2(),执行console.log(a),在该作用域内没有a,前往上一级作用域寻找a,找到 var a,未赋值,所以结果为undefined。

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