浅谈JavaScript 函数参数传递到底是值传递还是引用传递

 更新时间:2016年08月23日 09:57:51   投稿:jingxian  
下面小编就为大家带来一篇浅谈JavaScript 函数参数传递到底是值传递还是引用传递。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是值传递和引用传递都具备。那么JS的参数传递到底是怎么回事呢?事实上以下的演示也完全可以用于Java

首先来一个比较简单的,基本类型的传递:

function add(num){
  num+=10;
  return num;
}
num=10;
alert(add(num));
aelrt(num);
//输出20,10

对于这里的输出20,10,按照JS的官方解释就是在基本类型参数传递的时候,做了一件复制栈帧的拷贝动作,这样外部声明的变量num和函数参数的num,拥有完全相同的值,但拥有完全不同的参数地址,两者谁都不认识谁,在函数调用返回的时候弹出函数参数num栈帧。所以改变函数参数num,对原有的外部变量没有一点影响。

再来看一个较复杂的,对象引用类型的传递:

function setName(obj){
  obj.name="ted";
}
var obj=new Object();
setName(obj);
alert(obj.name);
//输出ted

以上代码的运行的实质是:创建了一个object对象,将其引用赋给obj(在C里面就直接是一个内存地址的赋值),然后在传递函数参数的时候,做了一件与前一个方法相同的事情,复制了一个栈帧给函数参数的obj,两者拥有相同的值(不妨将其理解为object对象的地址),然后在setName做改变的时候,事实上是改变了object对象自身的值(在JAVA里称之为可变类),在改变完成之后同样也要弹出函数参数obj对应的栈帧。

所以对应的输出是改变后object对象的值

那么可能有的朋友可能会问,这样也可以理解为一个引用传递(指针传递)呀?不,这里严格的说,在和JAVA类似的语言中,已经没有了指针,在JAVA里将上述过程称之为一个从符号引用到直接引用的解析过程。在C里面,指针就是一个具有固定长度的类型(在大多数的C编译器里是2个字节),但在JAVA类似的语言里,引用也有自己的属性和方法,只是你不能直接去访问和控制它,所以它从某种意义上也是一种对象,这种机制也很大程度的避免了内存泄露,术语称之为内存结构化访问机制。

为了证明上述观点,稍微改造下上述例子:

function setName(obj){
  obj.name="ted";
  obj=new Object();
  obj.name="marry";
}
var obj=new Object();
setName(obj);
alert(obj.name);
//输出ted

这个例子与上一个例子的唯一不同是这里将一个新的对象赋给了函数参数obj,这样函数参数obj和原有的引用obj参数,有着完全不同的值和内存地址。

以上这篇浅谈JavaScript 函数参数传递到底是值传递还是引用传递就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • TypeScript常见类型及应用示例讲解

    TypeScript常见类型及应用示例讲解

    这篇文章主要介绍了TypeScript常见类型及应用示例讲解,本章我们会讲解 JavaScript 中最常见的一些类型,以及对应的描述方式,有需要的朋友可以借鉴参考下
    2022-02-02
  • 微信小程序实现上传照片代码实例解析

    微信小程序实现上传照片代码实例解析

    这篇文章主要介绍了微信小程序实现上传照片代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • JS实现电子时钟入门操作

    JS实现电子时钟入门操作

    这篇文章主要为大家详细介绍了JS实现电子时钟入门操作,实现带有表盘的时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 微信小程序实现播放音频

    微信小程序实现播放音频

    这篇文章主要为大家详细介绍了微信小程序实现播放音频,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 第一次接触JS require.js模块化工具

    第一次接触JS require.js模块化工具

    第一次接触JS require.js模块化工具,本文为大家介绍了JS模块化工具require.js教程第一课认识require.js,编写require.js,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 小程序云开发之用户注册登录

    小程序云开发之用户注册登录

    这篇文章主要为大家详细介绍了小程序云开发之用户注册登录,带云数据库配置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Javascript实现base64的加密解密方法示例

    Javascript实现base64的加密解密方法示例

    下文是base64用javascript写出来的函数和方法。非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-06-06
  • JavaScript设计模式之性能优化模式享元模式

    JavaScript设计模式之性能优化模式享元模式

    这篇文章主要介绍了JavaScript设计模式之性能优化模式享元模式,享元设计模式是用于性能优化的模式,这种设计模式的核心在于可以共享技术并支持对大量细分过后的对象进行调整,更多相关内容需要的小伙伴可以参考一下
    2022-06-06
  • JavaScript实现跟随广告的示例代码

    JavaScript实现跟随广告的示例代码

    浮动广告是目前网站很常见的一种广告形式,浮动广告能实时跟随用户的浏览,有效的传达产品要表达的意思,达到很好的传播效果。本文使用JavaScript实现跟随广告的示例代码,感兴趣的可以了解一下
    2021-11-11
  • 性能优化之代码优化页面加载速度

    性能优化之代码优化页面加载速度

    本文主要介绍了代码优化页面加载速度的方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03

最新评论