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. 【angularjs】【学习心得】路由实战篇

    今天还是来说一下angular中的路由模块.我们实际项目中,各个页面的切换是经常会与Auth相关的.比如我网站的后台,是需要登录过的用户才能进去,那么我们用angularJS做前端路由的时候应该怎么完 ...

  2. Java 原型模式

    http://www.cnblogs.com/itTeacher/archive/2012/12/02/2797857.html http://www.cnblogs.com/java-my-life ...

  3. eclipse xml自动提示

    找到所需要的dtd文件: window->preferences->xml->xml catalog : public id 输入对应的字符串:

  4. 微信LazyMan笔试题的深入解析和实现

    一.题目介绍  以下是我copy自网上的面试题原文: 实现一个LazyMan,可以按照以下方式调用: LazyMan("Hank")输出: Hi! This is Hank!   ...

  5. java文件上传(单文件 多文件)与删除

    /** * 文件上传--单文件 * * @param request * @param response * @param path * 文件存放路径(path为WebApp\后面的内容) * @re ...

  6. Ubuntu安装搜狗拼音

    p { margin-bottom: 0.25cm; direction: ltr; color: rgb(0, 0, 0); line-height: 120% } p.western { font ...

  7. Spark:控制日志输出级别

    Spark:控制日志输出级别 终端修改 在pySpark终端可使用下面命令来改变日志级别 sc.setLogLevel("WARN") # 或者INFO等 修改日志设置文件 ** ...

  8. SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数

    -- SQL SERVER 判断是否存在某个触发器.储存过程 -- 判断储存过程,如果存在则删除IF (EXISTS(SELECT * FROM sysobjects WHERE name='proc ...

  9. [nginx]Windows和Mac下,nginx反向代理服务器配置

    最近做项目,前端需要用到nginx反向代理来转发请求,总结了一下在Windows和Mac上的配置,以备查询. 一.Windows 修改nginx的配置文件,nginx.conf. 1)nginx.co ...

  10. 蓝桥网试题 java 基础练习 字符串对比

    -------------------------------------------------------------------------------- java有很多可以拿来用的方法为什么不 ...