美文网首页
JavaScript 函数作用域

JavaScript 函数作用域

作者: 勇者闯魔城 | 来源:发表于2018-10-22 23:39 被阅读0次

    一.作用域

    作用域指的是变量存在的范围。ES5 有2种。一是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;二是函数作用域,变量只在函数内部存在。

    全局变量:函数外部声明的变量就是,它可以在函数内部读取。
    局部变量:在函数内部定义的变量,外部无法读取。
    注意:函数内部定义的变量,会在该作用域内覆盖同名全局变量。

    二.执行函数过程中,内部变量的查找顺序。

    函数在执行的过程中,先从自己内部找变量。如果找不到,再从创建当前函数所在的作用域去找, 以此往上。(注:函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域)

    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 调用fn1,调用fn3,调用fn2console.log(a),fn2内没有变量a,便查找fn2声明所在的作用域fn1找到var a =2

    三.函数作用域与变量提升

    与全局作用域一样,函数作用域内部也会产生“变量提升”现象。var命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部

    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 注意:因为函数fn2调用在var a = 4 之前,所以fn2读取的是变量前置的a的初始值undefined。可以看成以下。

    var a = 1
    function fn1(){
    
      function fn3(){
        var a
        function fn2(){
          console.log(a)
        }
        fn2()
        a = 4
      }
      var a = 2
      return fn3
    }
    var fn = fn1()
    fn() 
    

    相关文章

      网友评论

          本文标题:JavaScript 函数作用域

          本文链接:https://www.haomeiwen.com/subject/pjmnzftx.html