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. jquery.validate.js之自定义表单验证规则

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  2. 将 ext_net 连接到 router - 每天5分钟玩转 OpenStack(145)

    上一节完我们创建了外部网络 ext_net,接下来需要将其连接到 Neutron 的虚拟路由器,这样 instance 才能访问外网. 点击菜单 Project -> Network -> ...

  3. java精度计算代码,指定精确小数位

    java代码: public class App2 { public static void main(String[] args) { String val = checkNumber(" ...

  4. 浅谈Django的Q查询以及AngularJS的Datatables分页插件

    使用Q查询,首先要导入Q模块: from django.db.models import Q 可以组合使用&,|操作符用于多个Q的对象,产生一个新的Q对象,Q对象也可以用~操作符放在前面表示否 ...

  5. c# 应用NPOI 获取Excel中的图片,保存至本地的算法

    要求:读取excel中的图片,保存到指定路径 思路:  利用NPOI中 GetAllPictures()方法获取图片信息 步骤: 1.新建一个Windows窗体应用程序 2.桌面新建一个excel,贴 ...

  6. React Native 之 网络请求

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...

  7. vs2010入门程序和出错问题解决方案

    本篇文章分两个部分: 第一,如何建立一个Helloword工程 1.打开Vs2010新建项目 2.选择Visual C++>>Win32>>Win32控制台应用程序,输入项目名 ...

  8. PHP基础学习

    PHP基础学习 <?php //类型 $test=123; var_dump($test);//打印出类型和数值 echo '<hr/>'; echo gettype($test); ...

  9. Github windows客户端简单上手教程

    作为一个前端,如果不知道GitHub,那你有可能就是一个假前端(O(∩_∩)O哈哈~)开个玩笑...进入正题,咳咳... 1.第一步要在GitHub官网下载最新的客户端,网址是https://desk ...

  10. java初级开发程序员(初识java)

    据我们老师讲说:“学习java高级语言,每个程序员最初写的一个程序就是helloword,向世界打招呼! public class HelloWord{   //必须和文件名相同 public sta ...