学习笔记:JavaScript传参方式———ECMAScript中所有函数的参数都是按值传递
我们把命名参数(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中所有函数的参数都是按值传递的更多相关文章
- 《JavaScript高级程序设计》读书笔记--ECMAScript中所有函数的参数都是按值传递的
ECMAScript中所有函数的参数都是按值传递的.也就是说把函数外部的值复制给函数内部的参数(内部参数的值的修改不影响实参的值). 基本类型变量的复制: 基本类型变量的复制,仅仅是值复制,num1和 ...
- javascript中所有函数的参数都是按值传递的
[javascript中所有函数的参数都是按值传递的] 参考:http://www.jb51.net/article/89297.htm
- C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例
C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...
- MySQL_PHP学习笔记_2015_0614_PHP传参总结_URL传参_表单传参
1. PHP 传参总结 1.1 url 传参 解析方法(下面两种解读方式均可以): $firstName1 = $_GET['firstName']; $firstName2 = $_RE ...
- [C#学习笔记3]关于Main(string[ ] args)中args命令行参数
Main(string[] args)方法是C#程序的入口,程序从这里开始执行,在这里结束.C#代码逻辑要包含在一个类型(Type)中,游离的.全局的变量或函数是不存在的,这里的类型包括类(class ...
- ECMAScript中所有的函数的参数都是按值传递的
看下面一段代码 function setName(obj){ obj.name='Nicholas'; obj=new Object(); obj.name="Greg"; } v ...
- javascript中所有函数参数都是按值传递
在看<JavaScript高级程序设计>(第三版)的时候,传递参数这一节,里面提到 ECMAScript中所有函数的参数都是按值传递的 它自己的解释是, 把函数外部的值复制给函数内部的参数 ...
- awk中传参方式
结合编辑数据文件的shell脚本学习awk传参方式,该脚本功能: a.取VIDEOUSR_11082017_0102_ONLINE_STASTIC.dat文件中第87个字段的低8位: b.将每行数据的 ...
- react中的传参方式
react是一个SPA模式,即组件嵌套租,在一个单页面的应用中组件间的数值传递是必不可少的,主要的传参方式大致有一下几种: 1,在挂载的地方给组件传参 ReactDOM.rander(<a na ...
随机推荐
- 2012 East Central Regional Contest 解题报告
昨晚各种莫名其妙卡题. 不过细看这套题还挺简单的.全是各种暴力. 除了最后一道题计算几何看起来很麻烦的样子,其他题都是很好写的吧. A. Babs' Box Boutique 题目大意是给出不超过10 ...
- python 列表函数(转)
list函数: 功能:将字符创转化为列表,例: 列表基本函数: 1.元素赋值,例: 注意:通过list[0]= 'hel',如果原来位置上有值,会覆盖掉原来的. 2.分片操作 1)显示序列,例: 注意 ...
- Mac下配置cocos2d-x开发环境(android和ios)
一.下载cocos2d-x http://cocos2d-x.org/projects/cocos2d-x/wiki/Download cocos2d-x-2.1.4.zip @ June.18, 2 ...
- C语言中的各种修饰符
C允许同时使用多于一个的修饰符,这就使得可以创建一下各种类型: int board[8][8];//int数组的数组 int **ptr;//指向int的指针的指针 int *risk[10];//具 ...
- WinDBG快速定位异常位置
在WinDBG中通过搜索内存中保存的CONTEXT结构来定位发生的异常信息,再通过WinDBG命令.cxr显示对应的调用堆栈信息. .foreach ( place { s-[1]d 0 L?FF ...
- ASP.NET页面与IIS底层交互和工作原理详解(第二回)
引言 在 Part.1 Http请求处理流程 一文中,我们了解了Http请求的处理过程以及其它一些运作原理.我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttpMod ...
- 解决SecureCRT中文显示乱码
操作步骤 以下两步: 远程linux机器.修改环境变量LANG.例如在~/.bash_profile里面添加 export LANG=zh_CN.UTF8 重新登录之后生效. 现在查看一下当前设置: ...
- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
执行远程shell,启动远程机器的tomat时遇到次错误.后来发现原来是远程机器的.profile被人改掉了! 在.profile里加入 export JAVA_HOME=/home/evans/jd ...
- Freebsd 编译内核
# cd /usr/src/sys/i386/conf # cp GENERIC GENERIC.20060812# ee GENERIC 如果要加入ipf防火墙的话则加入options ...
- hdu 4271 动态规划
思路:考的是字符串的编辑距离.在蓝桥杯2012年决赛上出现过. #include<iostream> #include<cstdio> #include<cstring& ...