zoukankan      html  css  js  c++  java
  • JavaScript 作用域链范例

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

    范例

    例1

    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()  //输出多少
    • 执行过程分析

    先执行 var a=1,var fn=fn1(),进入function fn1(),执行var a=2,return fn3,进入function fn3(),执行var a =4,fn2(),进入function fn2(),执行console.log(a),由于本作用域没有a,因此向上一级作用域寻找a,即var a=2,因此输出2。

     
    例1 - 输出结果
     
    例1 - debug



    例2

    var a=1
    function fn1() {
      function fn3() {
      var a=4
      fn2()
      }
      
      var a=2
      return fn3
    }
    
    function fn2() {
      console.log(a)
    }
    
    var fn=fn1()
    fn()  //输出多少
    • 执行过程分析

    执行var a=1,var fn=fn1(),进入function fn1(),执行var a=2,return fn3,执行function fn3(),执行var a=4,fn2(),执行function fn2(),执行console.log(a),此作用域没有a,所以向上一级作用域寻找a,即最外层的var a=1,因此输出结果1。

     
    例2 - 输出结果
     
    例2 - debug



    例3

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

    先执行var a=1,var fn=fn1(),进入function fn1(),执行 var a=2 , return fn3,进入function fn3(),由于fn2()在var a=4之前,但var a会被前置,即等同于

    var a
    fn2()
    a = 4
    

    所以先执行var a,在执行fn2(),进入function fn2(),执行console.log(a),这个时候该作用域没有a,去上一层作用域找a,找到var a,但此时的a还没有赋值,因此输出undefined。

     
    例3 - 输出结果
     
    例3 - debug
  • 相关阅读:
    “sockaddr”: “struct”类型重定义的错误的解决办法《转》
    2019年车险
    tinylib
    命令行利用ffmpeg实现rtmp推流《转》
    Inno setup 判断系统32位还是64位
    vs2015编译OBS-Studio21.1.12
    啃OBS源码-界面汉字
    百年孤独人物关系1
    windows命令行查看文件MD5
    python 玩爬虫安装了一大堆第三方库
  • 原文地址:https://www.cnblogs.com/evenyao/p/9345550.html
Copyright © 2011-2022 走看看