最近差不多一个月没写博客了,主要的原因是目前在使用 Markdown 写学到的一些心得,一方面方便记笔记,另一方面页面排版更加的美观。

个人笔记站点 : https://yewenxiang23.github.io


碰到的问题:

今天碰到一个关于传递参数的问题,想了一下午,终于想通了,打算总结记录一下:

解决的思路:传参是值复制的一个过程,传递的是值,

1         function setName(obj){
2             obj.name = "yewenxiang";
3             obj = new Object();
4             obj.name = "ye";
5         }
6         var person = new Object();
7         setName(person);
8         console.log(person.name); //yewenxiang

上面的代码输出了 "yewenxiang",而不是"ye"。感觉非常的怪异,下面来对于传递参数做一个总结。


传递参数:

  • 所有的函数参数都是按值传递的

   也就是说,把函数的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

值有两种类型:

  • 基本类型:值保存在栈内存中,复制的时候也是把值同时也复制了一份。
  • 引用类型:值保存在堆内存中,栈内存中保存的只是指向堆内存中值的一个指针,复制的时候纸箱基本类型传参:

例子就拿 《javascript高级程序设计》上的例子来说

基本类型的值传参:

1 function addTen(num){
2             num += 10;
3             return num;
4 }
5 var count = 20;
6 var result = addTen(count);
7 console.log(count); //20
8 console.log(result); //30

函数 addTen() 有一个num 参数,而参数实际上是函数的局部变量。在调用这个函数,并传入参数 count时。由于 count的值为20,传递参数的过程是一个值得复制过程,也就是把 count 的值20,复制给了参数(函数的局部变量) num = 20。在堆内存中存在了 count=20 和num=20,两个变量是互相不干扰的。

引用类型的值传参:

1         function setName(obj){
2             obj.name = "yewenxiang";
3         }
4         var person = new Object();
5         setName(person);
6         console.log(person.name); //"yewenxiang"

这个例子中传入了一个 person 对象,也就是引用类型,引用类型的复制和基本类型的复制不同,复制的是栈内存 变量person 中保存的地址,这个地址也指向堆内存中同一个对象。所以修改了函数局部变量 obj的name属性为"yewenxiang" ,person.name也变为了"yewenxiang"。

证明参数是按值传递的一个例子:

1         function setName(obj){
2             obj.name = "yewenxiang";
3             obj = new Object();
4             obj.name = "ye";
5         }
6         var person = new Object();
7         setName(person);
8         console.log(person.name); 

这是我碰到的问题,开始我想的是输出 "ye" ,为什么会输出 "yewenxiang"呢。明明obj代表的是person这个对象,而函数内部赋值之后又重新构造了一个新对象并赋值为 "ye",所以应该输出 "ye"啊,为什么不是呢?那肯定是想错了嘛。废话少说 直接上图:

上面3.4行代码执行之前:

3.4行代码执行之后:

由于obj为函数的局部变量,那么我们如何证明呢?

 1         function setName(obj){
 2             obj.name = "yewenxiang";
 3             console.log(obj.name); //yewenxiang
 4             obj = new Object();
 5             obj.name = "ye";
 6             console.log(obj.name); //ye
 7         }
 8         var person = new Object();
 9         setName(person);
10         console.log(person.name); //yewenxiang
11         console.log(obj.name); //报错

这样就证明了我的想法是正确的。

   

转载于:https://www.cnblogs.com/yewenxiang/p/6337961.html

传递参数的2种情况的理解。相关推荐

  1. Django通过URL传递参数的4种方法

    [转自ian的个人博客]http://www.icodelogic.com/?p=501 感谢ian的总结! 1 无参数情况 配置URL及其视图如下: (r'^hello/$', hello)  de ...

  2. vue-router 传递参数的几种方式

    本文转载自:https://blog.csdn.net/crazywoniu/article/details/80942642 vue-router传递参数分为两大类 编程式的导航 router.pu ...

  3. Asp.net页面之间传递参数的几种方法

    Asp.net页面之间传递参数的几种方法 第一种方法: 通过URL链接地址传递Request.QueryString send.aspx:    protected void Button1_Clic ...

  4. 表单提交和超链接请求传递参数的几种方式

    表单提交和超链接请求传递参数的几种方式 这段时间在使用easy-ui的datagrid,他有自己提交表单的方式,所以就整理整理页面对参数的提交方式: 注:下面代码都已经过测试. 1. HTML提交表单 ...

  5. jmeter跨线程组传多个值_Jmeter 跨线程组传递参数 之两种方法(转)

    终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...

  6. Asp.net页面之间传递参数的几种方法荟萃

    第一种方法: 通过URL链接地址传递  send.aspx:   protected void Button1_Click(object sender,EventArgs e)     {       ...

  7. jsp传递参数的四种方法

    1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="index.jsp"?a= ...

  8. Android开发之fragment传递参数的两种方法

    非常简单一种是通过bundle,另外一种是通过fragment提供的instantiate(过时方法),都是kotlin版本,直接上代码吧: 方法一: //fragment传递参数方法一val fra ...

  9. [转]Delphi过程函数传递参数的几种方式

    在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out.另一种不加修饰符的为默认按值传递参数. 一.默认方式以值方式传递参数 procedure TForm1.ProcNormal( ...

最新文章

  1. 优化系统后VS启动不了问题的一种解决方案
  2. 谷歌相册也不能无限白嫖了,「地主家」也烧不起免费网盘
  3. android学习日记24--Android 菜单开发
  4. 1031 Hello World for U (20 分)【难度: 一般 / 知识点: 找规律】
  5. VTK:彩色海拔地图用法实战
  6. Java类型推断将不再支持可变性规范
  7. Docker之DockerFile讲解
  8. 注意!下个月开始 GitHub 新建存储库的默认分支就不叫“master”了!
  9. 博图帮助乱码解决方法
  10. 基于大数据的资金流量分析:思路与应用前景设想
  11. 新加坡政府开放数据门户网站
  12. 记参加 2022 Google开发者大会
  13. linux中原子操作atomic_read、atomic_set、atomic_add、atomic_sub
  14. win10磁盘100%占用
  15. Python-各种Loss总结
  16. 【C4D周练作业031-040】周练作业渲染了个奥特曼哈哈~
  17. class 和 def
  18. 将DataFrame中的时间转换为时间戳
  19. SAP 数据字典常用数据类型
  20. 什么是企业防火墙,什么是策略?

热门文章

  1. Android----Fragments详解
  2. Activiti中的关于子流程中的并发节点标记处理
  3. ES5-12 【utils】继承深入、call、apply、圣杯模式、模块化
  4. 如何构建一个真实的推荐系统?
  5. export和export default的区别
  6. 一个go1.9.x 编译器内联引起的栈信息错乱的问题分析
  7. 阿里云openapi接口使用,PHP,视频直播
  8. 真静态和伪静态的区别
  9. oracle常用的工具软件
  10. NYOJ-522 Interval