JavaScript中函数参数的按值传递与按引用传递(即按地址传递)
首先声明一句:JavaScript中所有函数的参数都是按值传递的!不存在按引用传递!
在讲传递参数之前我们先来讲一下指针。
学过C指针的应该都知道,指针变量中保存的是一个地址,程序可以根据所保存的地址访问内存中对应的值并进行操作,如下图:
其中地址为0x00000016保存的是一个地址,指向地址0x00000036,即0x00000016被开辟为一个指针变量,可以引用0x00000036地址的值,这是按引用方式访问变量;另外一种访问变量的方式是按值访问,即图中0x00000008地址。
在JavaScript中有两种数据类型:基本类型和引用类型。其中,基本类型使用按值方式访问变量,引用类型使用按引用方式访问变量(而且JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象)。
因为基本类型和引用类型采用的访问方式不同,所以造成了两个操作上的区别,分别是“传递参数”和“复制变量值”。
好了,回到主题。一般来说,传递参数有两种方式:按值传递和按引用传递。那么两种方式有什么不同呢?
- 按值传递,即直接将变量的值传递到函数的参数中。打个比方,有一个String基本类型变量test的值为"Hello"(即var test = "Hello";),在传递参数时被传递的是值"Hello",因而无论在函数中对参数进行怎样的操作都不会影响到变量test。如下图:

- 按引用传递,即将变量的地址传递到函数的参数中。因为JavaScript不存在按引用传递,所以我举一个C语言的例子,假设有一个函数void test(int *a){*a = *a + 10;},在main函数中这么调用“int b = 10;test(&b);”,此时,在test函数的参数传递过程中是将b的地址传递到test函数的参数a中,因而在函数中对参数进行操作可以反映到函数外。如下图:

看到这里,可能大家都发现,按值传递和按引用传递有一个很明显的区别:当使用按值传递时,在函数中对参数进行操作不会影响到函数外对应的变量;使用按引用传递时则会影响。
用过JavaScript的都知道,当传递引用类型的变量时,在函数中对参数进行操作会影响到函数外对应的变量!于是有些小伙伴则认为:引用类型是按引用传递的。很抱歉的是,JavaScript中不存在按引用传递,所有参数都是按值传递!
那么问题来了,为什么引用类型使用按值传递却会影响函数外对应的变量呢?
这是因为,引用类型的变量本就是一个引用,它的值是堆内存中Object的地址,当使用按值传递时传递的值本就是一个地址,所以在函数中对参数进行操作会影响到函数外对应的变量。
JavaScript中函数参数的按值传递与按引用传递(即按地址传递)的更多相关文章
- JavaScript中函数参数的值传递和引用传递
结论: 对于数字.字符串等基本类型变量,是将它们的值传递给了函数参数,函数参数的改变不会影响函数外部的变量. 对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组) ...
- JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域
一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){ var bar = 1; fn(); } var bar = 99; test(fun ...
- Javascript中函数的四种调用方式
一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属 ...
- JavaScript中函数的形参和实参的实现原理剖析
我们都知道JS里面参数的传递是可以不一样的,比如我们有一个函数: <script type="text/javascript"> function one(a,b,c) ...
- JavaScript中函数的调用
JavaScript中函数的调用 制作人:全心全意 在JavaScript中,函数定义后并不会自动执行,要执行一个函数需要在特定的位置调用该函数,调用函数需要创建调用语句,调用语句包含函数名称和参数. ...
- JavaScript中函数的定义
JavaScript中函数的定义 制作人:全心全意 在JavaScript中,函数是由关键字function.函数名加一组参数以及置于大括号中需要执行的一段代码定义的.定义函数的基本语法格式如下: f ...
- javascript中函数声明、变量声明以及变量赋值之间的关系与影响
javascript中函数声明.变量声明以及变量赋值之间的关系与影响 函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 ...
- 改变JavaScript中函数的内部this指向!
改变JavaScript中函数的内部this指向! 第一种方法 call call 可以 调用函数 + 改变函数内的this指向! var obj = { name: 'lvhang' } funct ...
- JavaScript中函数的调用!
JavaScript中函数的调用! 1 普通函数 // 1 普通函数 function fn() { console.log(123); } // 函数名 + 一个小括号! 或者 函数名.call() ...
随机推荐
- python zip文件密码爆破
#!/usr/bin/env # coding=UTF-8 import zipfile import threading import os import sys class CrackZip: d ...
- decode()与case then 学习与使用
今天做项目的时候遇到一个oracle数值转换的问题,按需求需要对匹配系统时间进行固定赋值,为了避免增加复杂度并易于维护,尽量不要使用存储过程或触发器,最好是使用oracle 自带函数. 如: SQL& ...
- keybd_event 转载
转自 http://apps.hi.baidu.com/share/detail/14468670 Option Explicit Private Declare Sub keybd_event Li ...
- JavaScript实现回车键切换输入框焦点
用JavaScript实现回车键切换输入框焦点的功能,不是回车换行哦,在Textarea中,回车换行是默认功能,不过若要在textarea中使用 回车切换输入框焦点功能的话,回车换行就要失效了,不过i ...
- hdu 2992 Hotel booking
http://acm.hdu.edu.cn/showproblem.php?pid=2992 #include <cstdio> #include <cstring> #inc ...
- Visual Studio新建的源文件的默认编码
原来VS新建的源文件默认的编码是根据系统locale选择的.我的是国标2312.我草.可坑死我了.一直不知道. 当时主要是需要用doxygen生成html文档,它默认的输入文件的格式是UTF-8,是不 ...
- Map的遍历方法及String和其它类型的相互转化
Map的遍历方法: package com.lky.test; import java.util.HashMap; import java.util.Iterator; import java.uti ...
- Java 截取反斜杠--java使用split拆分特殊字符
Java 截取反斜杠 replaceAll和split (“\”) 问题解决办法 xxx.split("\\") 显然得不到想要的结果 正确方法 xxx.split("\ ...
- JS(一)
循环还是很有意思的: 1) 安全数的作业: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- 【C#网络基础】C# get post请求
using KTCommon.Helper; using KTCommon.LOG; using System; using System.Collections.Generic; using Sys ...