ECMAScript中所有函数的参数都是按值传递的,简单讲就是函数外部的值 复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。切记访问变量有按值访问和按引用访问,而参数只能按值传递。

在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(可以把ECMAScript函数中的参数想象成局部变量);向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量。

实例1:

// 参数是基本类型的值
function add(n){
n += 1;
return n;
} var num = 2;
var result = add(num);
alert(num); // 2
alert(result); // 3

  

  在函数内,参数n的值被加上1,但这并不会影响函数外的num变量,参数n与变量num仅仅是具有相同值,但互不相识。如果是按引用传递,则变量num的值将变为3.

实例2:

// 参数是对象
function setName(obj){
obj.name = "123";
} var p = new Object();
setName(p);
alert(p.name); // "123"

  

这里创建了一个对象,并保存在变量p中,当这个对象被传递到setName()函数中之后就被复制给了obj。在函数内,obj和p引用的是同一个对象。也可以说即使这个对象是按值传递的,obj也会按引用来访问同一个对象。所以在函数内为obj添加name属性后,函数外的p会反映出来,这里p指向的对象在堆内存中只有一个,并且是全局对象。

很多错误地认为在局部作用域中修改的对象会在全局作用域中反映出来,就说明是按引用传递。为了证明上面例子是按值传递,再看下面的实例3:

function setName(obj){
obj.name = "123";
obj = new Object(); // obj的值变为堆内存中一个新的地址,但o变量的值并不受影响
obj.name = "321";
} var p = new Object();
setName(p);
alert(p.name); // "123"

  

这里与实例2中不同的是给obj重新定义了一个对象,并重新定义了name属性。如果p是按引用传递的,那么p就会自动被修改为指向name属性值为“321”的新对象,但实际访问p.name时,值仍是“123”。这就说明虽然在函数内修改了参数的值,但原始变量的引用不会受影响,保持不变。其实当参数是对象时,按值传递时传递的就是对象在堆内存中的地址  另:当在函数内部重写obj时,这个变量引用的就是一个局部对象了,而这个局部对象在函数执行完后立即被销毁。

在Java中也类似,以下是简单的实例:

public class Demo14 {
public static void main(String[] args) throws Exception{
int num = 2;
int result = add(num);
System.out.println(num); // 2
System.out.println(result); // 3 Obj o = new Obj();
setObjName(o);
System.out.println(o.getName()); // 123 } public static int add(int n){
n += 1;
return n;
} public static void setObjName(Obj obj){
obj.setName("123"); obj = new Obj(); // obj的值变为堆内存中一个新的地址,但o变量的值并不受影响
obj.setName("321");
} } class Obj{
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

  

【JS】JavaScript中的参数传递的更多相关文章

  1. 理解JavaScript中的参数传递 - leetcode189. Rotate Array

    1.关于leetcode 这是第一篇关于leetcode的题解,就先扯点关于leetcode的话. 其实很早前就在博客园看到过leetcode一些题解,总以为跟一般OJ大同小异,直到最近点开了一篇博文 ...

  2. [js]javascript中4种异步

    javascript中4种异步: 1.ajax 2.定时器 3.事件绑定 4,回调 定时器 //顺序执行 /* var s = 0; for (var i = 0; i < 10000; i++ ...

  3. js | javascript中获取dom元素的高度和宽度

    javascript中获取dom元素高度和宽度的方法如下: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网 ...

  4. Javascript 基础知识学习--javascript中的参数传递都是按值传递的

    ECMAScript中所有函数的参数传递都是按值传递的,无论参数是值类型还是引用类型的.过去我跟大多数人一样觉得跟传值类型相关. 自己写了一个测试的例子,确实如此 function add(a) { ...

  5. JS JavaScript中的this

    this是JavaScript语言中的一个关键字 它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用. function test() { this.x = 1; } 上面代码中,函 ...

  6. js | JavaScript中数据类型转换总结

    转载 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = “123”; a = Number(a); ...

  7. JS JavaScript中的文档碎片 DocumentFragement JS性能优化

    文档碎片是什么: 如果我们要在一个ul中添加100个li,如果不使用文档碎片,那么我们就需要使用append经常100次的追加,这会导致浏览器一直不停的渲染,是非常消耗资源的.但是如果我们使用文档碎片 ...

  8. JavaScript中解析JSON --- json.js 、 json2.js 以及 json3.js的使用区别

    JSON官方(http://www.json.org/)提供了一个json.js,json.js是JSON官方提供的在JavaScript中解析JSON的js包,json.js.json2.js.js ...

  9. javascript中外部js文件取得自身完整路径得办法

    原文:javascript中外部js文件取得自身完整路径得办法 有时候我们需要引入一个外部js文件,这个js文件又需要用到自己的路径或者是所在的目录,别问怎么又这么变态的需求,开发做久了各种奇葩需求也 ...

随机推荐

  1. Java div 使用说明

    1. 置于底部 position:absolute; bottom:0;

  2. 开篇 Android系统的体系结构

    1.APPLICATIONS (应用程序层) 2.APPLICATION FRAMEWORK(应用程序框架)  android应用程序提供了大量应用程序供开发者使用,当我看开发android应用程序时 ...

  3. 安装python2.7.13-64bit & Pycharm在两个python版本之间切换

    本来已经安装了32位的python27,但在使用轮廓系数评估k-means模型的优良性时,出现了内存溢出的报错.原来32为的python编译器最多只能使用4GB的内存,所以就打算换成64位的pytho ...

  4. pytho查找斐波那契序列中的值

    ''' 实现斐波那契序列,查找其中第N个数的值 ''' def FeiBSequence(list,N): length=len(list); i=0; while i<length: if N ...

  5. Ubuntu16.04安装GTK3主题:OSX-Arc

    Ubuntu16.04安装GTK3主题:OSX-Arc GTK3主题:OSX-Arc描述: 前几个月,Gnome3.20升3.22的时候,出现了大量主题崩溃的现象,其中包括Arc.Flatabulou ...

  6. 为 Jenkins 配置 .Net 持续集成环境

    去年年底,得益于公司引入 Jenkins,让我们在持续集成方面迈出了第一步,本文不赘述如何安装 Jenkins,主要关注点在于配置 .Net 环境.另外本文是在 Windows 环境下安装的 Jenk ...

  7. Java动态代理深入解析

    要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式. 在我 ...

  8. 警告1909。无法创建快捷方式VMware Workstation Pro.Ink。解决方法(附 VMware_workstation 12的安装方法)

    电脑之前装过VMware 10,很长时间没用就卸载了,也没有在意卸载的干不干净,直到最近需要用Linux系统,重新安装了VMware 12,就出现下面这样的情况: 警告1909.无法创建快捷方式VMw ...

  9. WebForm 全局对象、commend

    Repeater的增删改 内置对象:页面之间的数据交互为什么要用这些玩意? HTTP的无状态性 Response:响应请求 Request:获取请求 Cookies:保存登录状态----------- ...

  10. MongoDB基础之八 备份与恢复

    Mongodb导出与导入 1: 导入/导出可以操作的是本地的mongodb服务器,也可以是远程的.所以,都有如下通用选项:-h host 主机--port port 端口-u username 用户名 ...