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

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

作者: 行走的蛋白质 | 来源:发表于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>
  • 函数传参为值传递 传递的是对象指针的副本

相关文章

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

    作用域 值类型和引用类型的传递 函数传参为值传递 传递的是对象指针的副本

  • JS之变量、作用域和内存

    变量及作用域 1、基本类型和引用类型的值ECMAScript 变量:基本类型值和引用类型值。将一个值赋给变量时,解...

  • JS回顾变量、作用域、内存问题

    基本类型和引用类型的值属性的动态复制变量值传递参数检测类型 执行环境与作用域延长作用域链没有块级作用域声明变量提升...

  • 第八章 变量、作用域、内存

    变量及作用域 ​ JavaScript的变量是松散型(一个变量可以改变类型)。 基本类型和引用类型的值ECMA...

  • Day12-Java

    值传递和引用传递 值传递是值的拷贝, 引用传递是引用的拷贝 String 类型是引用类型, new String ...

  • struct和class的区别

    原文:iOS面试题大全 swift中,class是引用类型,struct是值类型。值类型在传递和赋值时将进行复制,...

  • js高级程序设计第四章(部分整理)

    变量、作用域、内存问题 4.1 基本类型和引用类型的值 基本类型: undefined, null, boolea...

  • js小结1

    变量作用域以及内存问题(垃圾回收) JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值。 ...

  • 第4章: 变量、作用域和内存问题

    4.1 基本类型和引用类型的值 区别:基本类型传递的是值, 操作的也是值本身.引用类型传递是对象的引用(也叫地址 ...

  • JS中容易出错的点

    基本类型和引用类型的赋值问题 上例很好地证明了:基本类型值按值传递,引用类型值按引用传递 同名变量和方法覆盖问题 ...

网友评论

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

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