学习笔记: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 ...
随机推荐
- [ES6] 12. Shorthand Properties in ES6
Where destructuring in ES6 allows you to easily get properties out of an object, this shorthand prop ...
- iOS-swift环形进度指示器+图片加载动画
demo.gif 如图,这个动画的是如何做的呢? 分析: 1.环形进度指示器,根据下载进度来更新它 2.扩展环,向内向外扩展这个环,中间扩展的时候,去掉这个遮盖 一.环形进度指示器 1.自定义View ...
- iOS开发——控制器OC篇&UINavigationController&UITabBarController详解
UINavigationController&UITabBarController详解 一:UINavigationController 控制器的属性: UINavigationControl ...
- 关于Autofac的使用陷阱
说明:本文是对参考文章的一个整理,做一个记录,基本没有翻译,详情请参看原文. 使用注意要点: Autofac will track every disposable component instanc ...
- javascript 变量解析
1.JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析).当你使用了一个变量,然后不久 ...
- Ubuntu上手动安装nginx
最近需要利用nginx上搭建一个网站,因此在自己的电脑上安装了nginx,现在分享一下自己在安装过程及遇到的问题. 1.下载需要的nginx版本的安装包. axel -n http://nginx.o ...
- iOS开发系列--让你的应用“动”起来
--iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...
- C#求所有可能的排列组合
static System.Collections.Specialized.StringCollection MakeStrings(string[] characters, int finalStr ...
- Dapper ORM 用法
假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.Dapper的优势:1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后就40K ...
- 【Java/Android性能优化1】Android性能调优
本文参考:http://www.trinea.cn/android/android-performance-demo/ 本文主要分享自己在appstore项目中的性能调优点,包括同步改异步.缓存.La ...