本文是我基于红宝书《Javascript高级程序设计》中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式。

(结合资料的个人理解,有不正确的地方,希望大家指出,谢谢啦!)

参考的资料有:

https://github.com/simongong/js-stackoverflow-highest-votes/blob/master/questions21-30/parameter-passed-by-value-or-reference.md

https://segmentfault.com/a/1190000005177386

首先,我们简单理解一下什么是按值传递和按引用传递。

按值传递:把函数外部的值复制给函数内部的参数,相当把值从一个变量复制到另一个变量,这两个变量是互不影响的。(传内存拷贝)

eg:

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

按引用传递:传内存指针。

  按引用传递,当向参数传递值时,传递的是这个值在内存中的地址,所以在局部作用域中对值进行的操作会反映在全局作用域中。因为它们是对同一地址进行操作的。

但是,ECMAScript中,当向参数传递引用类型的值时,如果直接说是“按值传递”,那么以下代码执行的结果会让我们有些疑惑:

code1:

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

但是如果因为上面的这种情况就断定不是“按值传递”,而是“按引用传递”的话,我们又无法解释下面的这种情况:

code2:

1  function setName(obj){
2           obj.name="Linshuling";
3           obj=new Object();
4           obj.name="lin";
5       }
6       var person=new Object();
7       setName(person);
8     alert(person.name);//Linshuling

所以,我在网上找到了另一种解释:

Call-by-sharing   传引用的拷贝。

当我重新阅读书中对此的解释时,发现这样的说法是符合的,书中的解释时这样的:在向参数传递引用类型的值时,会把这个值在内存中地址复制给一个局部变量,因此这个局部变量的变化会放映在函数外部。(注意此处,是把地址复制给一个局部变量,而不是直接传地址。)

我是这么理解的:

结合上面理解code1,code2:

在code1中 obj.name="Linshuling";会反映到全局作用域,是因为实际上是对同一地址进行了操作,如上图,即复制后的a的地址add,由于add和ad是一样的值,所以也会影响a。但是在code2中  obj=new Object(); obj.name="lin"; 这里实际上是在函数内部重写了obj,即重写了add,但是是不影响ad的,add和ad的值是完全独立的(从这里出发理解函数的参数传递是按值传递的,也就好理解了!),而且这里重新定义的obj是一个局部变量,这个局部变量会在函数执行完毕后立即被销毁。

更多专业前端知识,请上 【猿2048】www.mk2048.com

JS_理解函数参数按值传递相关推荐

  1. 深入理解javascript函数系列第二篇——函数参数

    前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数.本文是深入理解javascript函数 ...

  2. go 函数参数nil_深入理解 Go-Defer的机制

    defer 的作用和执行时机 go 的 defer 语句是用来延迟执行函数的,而且延迟发生在调用函数 return之后,比如 func a() int {defer b()return 0 } b 的 ...

  3. python函数参数理解

    1.位置参数 函数调用时,参数赋值按照位置顺序依次赋值. e.g. 1 def function(x): 2 3 return x * x 4 5 print function(2) 输出结果: 4 ...

  4. javascript中函数参数以及函数中局部变量作用域一点点理解

    2019独角兽企业重金招聘Python工程师标准>>> 函数中局部变量如果与外部变量重名,则用的是函数内部局部变量,用完就会被释放.我的理解函数是一个function定义的代码段,以 ...

  5. python函数参数的作用是_python函数参数理解

    1.位置参数 函数调用时,参数赋值按照位置顺序依次赋值. e.g. 1 deffunction(x):2 3return x *x4 5print function(2) 输出结果: 4 1 deff ...

  6. 数组作为函数参数的理解

    目录 1.形参是数组的形式 2.形参是指针的形式 3.总结 1.形参是数组的形式 例: //冒泡排序函数 void bubble_sort(int arr[]) {... }//调用函数 bubble ...

  7. c++builder传递参数_参数按值传递和按地址传递过程中,指向内存的指针如何变化?...

    大家好,我们今日继续讲解VBA代码解决方案的第125讲内容:关键字ByVal和ByRef的作用.在上一节中我们讲到了形式参数和实际参数的定义,同时讲到了从实际参数传递给形式参数的过程中按值传递和按地址 ...

  8. js系列教程4-函数、函数参数全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  9. Go 学习笔记(65)— Go 中函数参数是传值还是传引用

    Go 语言中,函数参数传递采用是值传递的方式.所谓"值传递",就是将实际参数在内存中的表示逐位拷贝到形式参数中.对于像整型.数组.结构体这类类型,它们的内存表示就是它们自身的数据内 ...

最新文章

  1. python网络爬虫初识_python爬虫(一)初识爬虫
  2. ubuntu系统php环境变量设置,Ubuntu系统环境变量详解
  3. 一文读懂AI 与神经网络发展历程
  4. VC++运算符与优先级
  5. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可回滚)
  6. PLSQL Developer 出现ORU-10027: buffer overflow, limit of 10000 bytes
  7. 【C语言简单说】十九:二维数组循环嵌套(1)
  8. Java equals()和hashCode()
  9. Android 获得ImageView中Image的绘制大小
  10. Jquery调用ajax参数说明
  11. 我读Code Complete 2 —— 第一章
  12. iosmask_iOS Mask属性的详细介绍及应用实例_IOS_脚本之家
  13. Java程序设计(基础)- 概述
  14. linux系统每次开机分辨率,解决linux分辨率设置过高 不能进入图形界面
  15. centeros安装mySQL
  16. Adobe flash player ActiveX、NPAPI、PPAPI 的区别
  17. 如何成为一名IC验证工程师——IC修真院直播
  18. cout 和printf的区别,输出不同
  19. 谷歌首席决策科学家:AI难免犯错,唯有人类可以悬崖勒马
  20. 4个易打动人的营销技巧

热门文章

  1. Java面向对象(3.1)--方法的重载,可变个数的形参,值传递机制,递归
  2. 常见排序算法的时间复杂度
  3. f12 卡 谷歌浏览器_抢券第二课:利用浏览器F12获取优惠券请求链接
  4. python-列表list和元组tuple
  5. python之路_前端基础之Bootstrap 组件
  6. 第2章 状态机思维与状态机变量
  7. 小不咖啡——自己写着玩的网站
  8. html 选择不能重复,人生,就是一次无法重复的选择(深度好文)
  9. join left semi_HIVE--left semi join
  10. CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法