我们把命名参数(arguments)视为局部变量,在向参数传递基本类型值时,如同基本类型变量的复制一样,传递一个副本,参数在函数内部的改变不会影响外部的基本类型值。如:

 function add10(num){
num += 10 ;
return num ;
}
var count = 10 ;
var result = add10(count);
alert(count);// 10
alert(result); //20

在向参数传递引用类型的值时,会把这个值 在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映子啊函数的外部,例如:

function addName(obj){
obj.name = "Jewl";
}
var someBody = new object();
addName(someBody);
console.log(someBody.name); //"Jewl"

这个例子其实是很让人困扰的,因为它更像按引用传递,说到传递方式,一般分为两种:

1.按值传递(call by value):函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。

2.按引用传递(call by reference):函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。

为了证明引用类型也是按值传递的,我们可以看看下面一个例子:

function addName(obj){
obj.name = "Jewl';
obj = new object();
obj.name = "Kancy";
}
var someBody = new object();
addName(someBody);
console.log(someBody.name) //"Jewl"

与前面一个例子的区别是,本例将一个新对象赋值给形参,如果是按引用传递,那么someBody的name也会随之改变,显然不是。在函数内部给obj赋值时,这个变量引用就变成了一个局部变量,在函数执行完就会被销毁。

  为了加深理解,我会再来看看js中引用类型值的存储,在js中,引用类型值是保存在内存中的对象,JavaScript不允许直接访问内存中的位置,也即不能直接操作对象的内存空间,在操作对象时,实际上是操作对象的引用而不是实际的对象。引用类型的值是按引用访问的。因此改变其中一个变量,就会影响另外一个变量。

var obj1 = new Object();
var obj3 = new Object();
var obj2 = obj1;
obj1.name = "Jewl";
obj3.name = "Kancy";
console.log(obj1.name); //"Jewl"
console.log(obj2.name); //"Jewl"
obj1 = obj3;
console.log(obj1.name); //"Kancy"
console.log(obj2.name); //"jewl"
console.log(obj3.name); //"kancy"

当我们把obj1赋值为obj3时,obj1指向和obj3相同的对象,obj2依然指向之前的对象。由此可以看出传参过程和此处类似,但不属于按引用传参,所以讲JavaScript里参数传递均归为按值传递。

JavaScript新手,第一次发文,请多指教。

学习笔记:JavaScript传参方式———ECMAScript中所有函数的参数都是按值传递的更多相关文章

  1. 《JavaScript高级程序设计》读书笔记--ECMAScript中所有函数的参数都是按值传递的

    ECMAScript中所有函数的参数都是按值传递的.也就是说把函数外部的值复制给函数内部的参数(内部参数的值的修改不影响实参的值). 基本类型变量的复制: 基本类型变量的复制,仅仅是值复制,num1和 ...

  2. javascript中所有函数的参数都是按值传递的

    [javascript中所有函数的参数都是按值传递的] 参考:http://www.jb51.net/article/89297.htm

  3. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  4. MySQL_PHP学习笔记_2015_0614_PHP传参总结_URL传参_表单传参

    1. PHP 传参总结   1.1 url 传参     解析方法(下面两种解读方式均可以): $firstName1 = $_GET['firstName']; $firstName2 = $_RE ...

  5. [C#学习笔记3]关于Main(string[ ] args)中args命令行参数

    Main(string[] args)方法是C#程序的入口,程序从这里开始执行,在这里结束.C#代码逻辑要包含在一个类型(Type)中,游离的.全局的变量或函数是不存在的,这里的类型包括类(class ...

  6. ECMAScript中所有的函数的参数都是按值传递的

    看下面一段代码 function setName(obj){ obj.name='Nicholas'; obj=new Object(); obj.name="Greg"; } v ...

  7. javascript中所有函数参数都是按值传递

    在看<JavaScript高级程序设计>(第三版)的时候,传递参数这一节,里面提到 ECMAScript中所有函数的参数都是按值传递的 它自己的解释是, 把函数外部的值复制给函数内部的参数 ...

  8. awk中传参方式

    结合编辑数据文件的shell脚本学习awk传参方式,该脚本功能: a.取VIDEOUSR_11082017_0102_ONLINE_STASTIC.dat文件中第87个字段的低8位: b.将每行数据的 ...

  9. react中的传参方式

    react是一个SPA模式,即组件嵌套租,在一个单页面的应用中组件间的数值传递是必不可少的,主要的传参方式大致有一下几种: 1,在挂载的地方给组件传参 ReactDOM.rander(<a na ...

随机推荐

  1. [Angular 2] Generate and Render Angular 2 Template Elements in a Component

    Angular 2 Components have templates, but you can also create templates inside of your templates usin ...

  2. android startActivityForResult的用法

    有时候我们需要把A activity提交数据给B  activity处理,然后把结果返回给A 这种方式在很多种情况需要用到,比如我应用的程序需要有拍照上传的功能. 一种解决方案是  我的应用程序 〉调 ...

  3. iOS开发——UI篇Swift篇&UIToolbar

    UIToolbar class UIToolBarUISearchBar: UIViewController,UISearchBarDelegate { var titleString:String! ...

  4. oc-31-多对象的内存管理

    在每个OC对象内部,都专门有8个字节的存储空间来存储引用计数器. 引用计数器的常见操作 retain消息:堆内存中对象的计数器变量 +(该方法返回对象本身,要想计数器变量加1就要调用对象的retain ...

  5. ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边) - from lanshui_Yang

    Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...

  6. 手机APP软件使用说明

    手机APP软件使用说明 一.            POLYCOM客户端(视频会议终端)登录: 1. 打开手机,找到Polycom软件,点击打开. 2. 打开软件后,界面如下,每次开会时,由会议管理员 ...

  7. [设计模式] .NET设计模式笔记 - 了解设计模式

    今天在TerryLee的cnblog(http://terrylee.cnblogs.com)里看到了与设计模式相关的整套文章,初学设计模式看完每篇文章后做些笔记和摘抄. ●什么是设计模式,什么是架构 ...

  8. 菜菜菜鸟学习之JavaWeb 入门1(自己的学习理解,不对之处请大神们多多指教啊)

    一.相关基础知识 1.C/S(Client/Server)架构和B/S(Browser/Server)架构 首先说C/S架构,简单讲其实很常见,类似QQ等需要下载客户端的应用程序就是建立在C/S架构中 ...

  9. TFS 2010 使用手册(四)备份与恢复

    本文参考了http://developer.51cto.com/art/201010/229066.htm的文章. TFS的备份与恢复一直没有很完整的解决方案,要完成一个很好的备份要有很多的手动步骤才 ...

  10. java 生成UUID

    UUID(Universally Unique Identifier)全局唯一标识符,是一个128位长的数字,一般用16进制表示. 算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成UUID, ...