美文网首页
作用域和值类型引用类型的传递及试题

作用域和值类型引用类型的传递及试题

作者: 行走的蛋白质 | 来源:发表于2019-12-03 20:00 被阅读0次

    作用域

    <script type="text/javascript">
        
        var num1 = 55
        var num2 = 66
    
        function fun1(num, num1) {
            // 函数中传递的变量有一个声明的过程因此在 fun1 中会重新声明 num 和 num1 两个变量
            // var num 
            // var num1
    
            num = 100 // 修改的为函数中的 num
            num1 = 100 // 修改的为函数中的 num1
            num2 = 100 // 修改的全局中的 num2
            console.log(num) // 100
            console.log(num1) // 100
            console.log(num2) // 100
        }
    
        fun1(num1, num2) // 变量的值储存在栈内存中 => 变量的传递为值传递
        console.log(num1) // 55
        console.log(num2) // 100
        console.log(num) // 报错 因为它没有被定义
    
    </script>
    
    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() //输出?
    
    //输出a=2
    //执行fn2函数,fn2找不到变量a,接着往上在找到创建当前fn2所在的作用域fn1中找到a=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() //输出多少
    
    //输出a=1
    //最后执行fn2函数,fn2找不到变量a,接着往上在找到创建当前fn2所在的全局作用域中找到a=1
    
    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() //输出多少
    
    //输出undefined
    //函数fn2在执行的过程中,先从自己内部找变量找不到,再从创建当前函数所在的作用域fn去找,注意此时变量声明前置,a已声明但未初始化为undefined
    
    var x = 10
    bar() 
    function foo() {
       console.log(x) 
    }
    function bar(){
       var x = 30
       foo() 
    }
    
    /*
    第2行,bar()调用bar函数
    第6行,bar函数里面调用foo函数
    第3行,foo函数从自己的局部环境里找x,结果没找到
    第1行,foo函数从上一级环境里找x,即从全局环境里找x,找到了var x=10。
    foo()的输出结果为10。
    */
    
    
    var x = 10;
    bar()  //30
    function bar(){
      var x = 30;
      function foo(){
        console.log(x) 
      }
      foo();
    }   
    /*
    第2行,bar()调用bar函数
    第3行,bar函数里面是foo函数
    第4行,foo函数在自己的局部环境里寻找x,没找到。
    foo函数到自己的上一级环境,即bar函数的局部环境里找x,找到var x = 30
    所以第2行的bar()输出为30
    */
    
    var x = 10;
    bar() 
    function bar(){
      var x = 30;
      (function (){
        console.log(x)
      })() 
    }
    /*
    第2行,bar()调用bar函数
    第三行,bar函数里的function()在自己的局部环境里寻找x,但没找到
    function()在上级环境即bar的局部环境里寻找x,找到var x =30,于是显示结果为30
    */
    


    值类型和引用类型的传递

    <script type="text/javascript"> 
    
        function Person(name, age, salary) { // 构造函数
            this.name = name
            this.age = age
            this.salary = salary
        }
    
        function fun2(person) {
            // var person = p 指向堆内存中的同一个地址
            person.name = 'h5' // 修改 p 中的 name
            person = new Person('js', 22, 5000) // 重新开辟一个堆内存空间存贮并改变 person 的指向
        }
    
        var p = new Person('java', 25, 8000) // 对象创建 栈内存存储变量以及对象在堆内存中的地址 堆内存存储对象 
        console.log(p.name) // java
    
        fun2(p)
        console.log(p.name) // h5
    
    </script>
    
    • 函数传参为值传递 传递的是对象指针的副本

    相关文章

      网友评论

          本文标题:作用域和值类型引用类型的传递及试题

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