ECMAScript中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。有不少开发人员在这一点上可能会感到困惑,因为访问变量有按值和按引用两种方式,而参数只能按值传递。

在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。请看下面这个例子:

function addTen(num) {num += 10;return num;
}
var count = 20;
var result = addTen(count);
alert(count);    //20,没有变化
alert(result);  //30
复制代码

这里的函数addTen()有一个参数num,而参数实际上是函数的局部变量。在调用这个函数时,变量count作为参数被传递给函数,这个变量的值是20。于是,数值20被复制给参数num以便在addTen()中使用。在函数内部,参数num的值被加上了10,但这一变化不会影响函数外部的count变量。参数num与变量count互不相识,它们仅仅是具有相同的值。假如num是按引用传递的话,那么变量count的值也将变成30,从而反映函数内部的修改。当然,使用数值等基本类型值来说明按值传递参数比较简单,但如果使用对象,那问题就不怎么好理解了。再举一个例子:

function setName(obj) {
obj.name = "Nicholas";    }
var person = new Object();
setName(person);
alert(person.name);    //"Nicholas"
复制代码

以上代码中创建一个对象,并将其保存在了变量person中。然后,这个变量被传递到setName()函数中之后就被复制给了obj。在这个函数内部,obj和person引用的是同一个对象。换句话说,即使这个变量是按值传递的,obj也会按引用来访问同一个对象。于是,当在函数内部为obj添加name属性后,函数外部的person也将有所反映;因为person指向的对象在堆内存中只有一个,而且是全局对象。有很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的。

带你深入理解传递参数相关推荐

  1. C++ 抛出异常与传递参数的区别

    代码便已运行环境:VS2017+Debug+Win32 1.C++ 异常处理基本格式 C++的异常处理机制有3部分组成:try(检查),throw(抛出),catch(捕获).把需要检查的语句放在tr ...

  2. href 带参数 打开exe_关于C#控制台传递参数和接收参数

    前言: 写了这么久程序,今天才知道的一个基础知识点,就是程序入口 static void Main(string[] args) 里的args参数是什么意思 ?惭愧... 需求: 点击一个button ...

  3. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  4. python查询数据库带逗号_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  5. 传递参数的2种情况的理解。

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

  6. 一文带你深入理解JVM内存模型

    一文带你深入理解JVM内存模型 一.JAVA的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物 ...

  7. python函数调用时的实参和形参之间传递_python 函数(实参与形参、传递参数)...

    函数 什么是函数?函数是带名字的代码块,用于完成具体的工作.写出一个函数后,就可以一直调用. 定义函数,函数的基本组成: 1.1 向函数传递参数 向函数中传递任意参数,这样打印出的结果就可以根据自己的 ...

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

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

  9. addEventListener事件监听传递参数

    Flash as3 addEventListener事件监听传递参数 var sayHello:String = "how are you"; btn1.addEventListe ...

最新文章

  1. 实现隐藏窗体而非关闭的方法
  2. Linux 自定义命令
  3. 大学生创新创业大赛案例_第五届“南博杯”大学生创新创业大赛决赛举行
  4. 更新电脑游戏安装合集,600+单机游戏,单机电脑游戏合集共约4T
  5. day 03 selenium与Beautifulsoup4的原理与使用
  6. C++多线程实例(_beginThreadex创建多线程)
  7. es6 ie不兼容 函数_ES6:什么是块级作用域?
  8. 腾讯TIM自动回复内容怎么自定义添加
  9. 【ES11(2020)】可选链操作符和空值合并运算符
  10. mysql二进制日志查看工具_Python 简易web日志查看工具可改装为命令行工具
  11. 【Python】猜数小游戏
  12. 跨多个交换机VLAN的配置方案设计(H3C)
  13. [转]六步使用ICallbackEventHandler实现无刷新回调
  14. python对于一元线性回归模型_Python|机器学习-一元线性回归
  15. sqlite3的命令简单说明
  16. ipmitool介绍_ipmitool管理工具
  17. C:\Windows\System32\drivers\etc\hosts文件的作用说明
  18. 建造者模式——画胖小人和瘦小人
  19. 虚拟机(VM)与JVM
  20. 使用awk处理多行fasta文件拆分为单个fasta文件,并去掉后缀^M

热门文章

  1. 阿里面试1234面详细完整流程——JAVA岗位
  2. 简单利用HUDText插件实现血条和怪物伤害减血效果
  3. 第11篇 web3.js - Ethereum JavaScript API(eth)
  4. 国科大计算机算法设计与分析陈玉福,中科院陈玉福计算机算法设计与分析期末简答题答案...
  5. Visual Studio 2015试用期过期,密钥激活
  6. tree老师:每天五分钟教你学linux命令03
  7. 服务器显示被登录成功,登录云服务器成功的显示是什么
  8. java bean 对象属性复制框架BeanMapping-01-入门案例
  9. 挑战51单片机(STC12C5A32S2)性能极限!19264+SD+FAT播放视音频!附视频取模软件
  10. 文件系统,你有想过怎么访问磁盘上存储的数据吗