javascript中函数的作用域和作用域链

作用域

作用域简单的理解就是:变量和函数可以访问到的范围。
作用域的范围分为两种:

  • 全局作用域
  • 局部作用域

全局作用域

全局作用域意指在代码块中任何地方都可以访问到的对象,那么这个对象就是全局作用域;

最外层函数之外声明的变量就是全局作用域的变量。
如下代码:

 var a = 1;
function fn(){
  console.log(a);  //1

var b = 3;
  function  xx(){
  var c = 3;
  console.log(a);  //1
  }
  xx();
  console.log(c);  //报错 c is not defined。
}
fn()

未使用var 声明的变量也拥有全局作用域;

function tt(){
  cc = "haha";
  function qq(){
    b = "hello";
    var non = 123123123;
    console.log(cc);    //haha
  }
  qq()
  console.log(b)  //hello
}
tt()

局部作用域

变量只在函数内部存在,外部无法访问。

function zxc(){
  var a = 1;
}
zxc()
console.log(a)  //a is not defined

作用域链

作用域链实质就是作用域之间搭建的一个桥梁。
但是,作用域链必须要记住的就是,外层作用域中的变量和函数可以被内层作用域所使用,但是内层作用域中的变量和函数外层是没有办法来直接访问的。
举个栗子:

  var a = 1
  function fn1(){

    function fn3(){
      function fn2(){
        console.log(b)
      }
      var b = 5
      fn2()
    }
    var a = 2
    //console.log(b)   //b is not defined
    return fn3
  }
  var fn = fn1()
  fn()

以上例子中,fn2如果找不到变量b,那么就会在他的外层fn3中去找变量b。
但是如果在fn3的外层找b是没有办法找到的,他只会往他的外层找,找到了就输出,找不到就报错。答案很显然找不到。

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

你可能感兴趣的:(javascript中函数的作用域和作用域链)