带你深入理解传递参数
来源:互联网 发布:云房数据怎么样 编辑:程序博客网 时间:2024/06/08 09:25
传递参数
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指向的对象在堆内存中只有一个,而且是全局对象。有很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的。
- 带你深入理解传递参数
- 深入理解Java参数传递
- 带你深入理解IOS Block
- 带你深入理解Android Handler机制
- 带你深入理解STL之RBTree
- 带你深入理解STL之RBTree
- 带你深入理解Android Handler机制
- 深入理解C函数传递参数的过程
- 深入理解Java方法调用的参数传递
- 通过内存模型深入理解参数传递方式
- 深入理解Java中方法的参数传递机制
- 深入理解java方法调用与参数传递
- 一步步带你深入理解数据结构系列--散列表
- Android EventBus源码解析 带你深入理解EventBus
- EventBus---EventBus源码解析 带你深入理解EventBus
- Android EventBus源码解析 带你深入理解EventBus
- Android EventBus源码解析 带你深入理解EventBus
- Android EventBus源码解析 带你深入理解EventBus
- ActiveMQ入门:点对点模型
- 第一篇博文来测试csdn的markdown编辑器
- 树莓派3--安装ffmpeg
- “Tensorflow+OpenCV“容器进行CNN数字识别训练
- pat 1118. Birds in Forest
- 带你深入理解传递参数
- HNOI2017滚粗记
- MongoDB系列(二):C#应用
- Spring PlaceHolder实现原理解析
- 学如逆水行舟
- 数组预处理
- MongoDB系列(一):简介及安装
- 快学scala笔记之01-数据类型
- 寻找峰值