JS_理解函数参数按值传递
本文是我基于红宝书《Javascript高级程序设计》中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式。
(结合资料的个人理解,有不正确的地方,希望大家指出,谢谢啦!)
参考的资料有:
https://github.com/simongong/js-stackoverflow-highest-votes/blob/master/questions21-30/parameter-passed-by-value-or-reference.md
https://segmentfault.com/a/1190000005177386
首先,我们简单理解一下什么是按值传递和按引用传递。
按值传递:把函数外部的值复制给函数内部的参数,相当把值从一个变量复制到另一个变量,这两个变量是互不影响的。(传内存拷贝)
eg:
function addTen(num){
num+=10;
return num;
}
var count=20;
var result=addTen(count);
alert(count);//
alert(result);//
按引用传递:传内存指针。
按引用传递,当向参数传递值时,传递的是这个值在内存中的地址,所以在局部作用域中对值进行的操作会反映在全局作用域中。因为它们是对同一地址进行操作的。
但是,ECMAScript中,当向参数传递引用类型的值时,如果直接说是“按值传递”,那么以下代码执行的结果会让我们有些疑惑:
code1:
function setName(obj){
obj.name="Linshuling";
}
var person=new Object();
setName(person);
alert(person.name);//Linshuling
但是如果因为上面的这种情况就断定不是“按值传递”,而是“按引用传递”的话,我们又无法解释下面的这种情况:
code2:
function setName(obj){
obj.name="Linshuling";
obj=new Object();
obj.name="lin";
}
var person=new Object();
setName(person);
alert(person.name);//Linshuling
所以,我在网上找到了另一种解释:
Call-by-sharing 传引用的拷贝。
当我重新阅读书中对此的解释时,发现这样的说法是符合的,书中的解释时这样的:在向参数传递引用类型的值时,会把这个值在内存中地址复制给一个局部变量,因此这个局部变量的变化会放映在函数外部。(注意此处,是把地址复制给一个局部变量,而不是直接传地址。)
我是这么理解的:
结合上面理解code1,code2:
在code1中 obj.name="Linshuling";会反映到全局作用域,是因为实际上是对同一地址进行了操作,如上图,即复制后的a的地址add,由于add和ad是一样的值,所以也会影响a。但是在code2中 obj=new Object(); obj.name="lin"; 这里实际上是在函数内部重写了obj,即重写了add,但是是不影响ad的,add和ad的值是完全独立的(从这里出发理解函数的参数传递是按值传递的,也就好理解了!),而且这里重新定义的obj是一个局部变量,这个局部变量会在函数执行完毕后立即被销毁。
JS_理解函数参数按值传递的更多相关文章
- 深入理解javascript函数系列第二篇——函数参数
× 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...
- 理解JavaScript函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...
- 深入理解javascript函数参数与闭包(一)
在看此文章,希望先阅读关于函数基础内容 函数定义与函数作用域 的章节,因为这篇文章或多或少会涉及函数基础的内容,而基础内容,我放在函数定义函数作用域 章节. 本文直接赘述函数参数与闭包,若涉及相关知识 ...
- javascript中所有函数参数都是按值传递
在看<JavaScript高级程序设计>(第三版)的时候,传递参数这一节,里面提到 ECMAScript中所有函数的参数都是按值传递的 它自己的解释是, 把函数外部的值复制给函数内部的参数 ...
- 浅析js的函数的按值传递参数
js的函数传参的方式是按值传递,正常情况下,改变函数参数的值,并不会对函数外部的变量造成影响.例如: 'use strict';var list = [1, 2, 3]; list.forEach(f ...
- JS中函数参数和函数返回值的理解
函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...
- c++中指针作为函数参数的详细理解
在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着 ...
- 深入理解C语言-结构体做函数参数
结构体做函数参数,在C语言中属于常见现象,此时为了内存考虑,不传递结构体,而是传递结构体的地址 结构体定义 struct Man { char name[64]; int age; }; 结构体可以与 ...
- python函数参数理解
1.位置参数 函数调用时,参数赋值按照位置顺序依次赋值. e.g. def function(x): 3 return x * x 5 print function(2) 输出结果: 4 def fu ...
随机推荐
- python爬虫实例
import re import requests from bs4 import BeautifulSoup # 主方法 def main(): # 给请求指定一个请求头来模拟chrome浏览器 h ...
- 上传文件---未能找到路径“D:\MyProject\Files\”的一部分
C# 使用控件FileUpload 上传文件,简单实例: protected void btnUpload_Click(object sender, EventArgs e) { string pat ...
- cookie 详解
cookie概览 cookie是Web浏览器存储的少量命名数据,它与某个特定的网页或网站关联在一起.cookie是用来给Web浏览器提供内存,以便脚本和服务端程序可以在一个页面使用另一个页面的输入数据 ...
- HTML LIST 输入框自动查询追加框,自动过滤 HTML5
<!DOCTYPE HTML> <html> <body> <form action="/example/html5/demo_form.asp&q ...
- python全栈开发day77-博客主页
1.文章分类 2.标签 3.归档 1) MySQL的日期格式化函数 DATE_FORMAT(字段名,格式) 2) Django ORM中如何执行SQL原生语句 (1) models.Article.o ...
- Apache ActiveMQ 远程代码执行漏洞 (CVE-2016-3088)案例分析
部署ActiveMQ运行环境 在linux上部署apache-activemq-5.10.0-bin.tar.gz 通过tar -zxvf apache-activemq-5.10.0-bin.ta ...
- Flink--基于mysql的sink和source
基于mysql的source操作 object MysqlSource { def main(args: Array[String]): Unit = { val env = StreamExecut ...
- img-html-2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- httpd的rpm包及源码安装配置
httpd的rpm包及源码安装配置 1.rpm包安装 系统环境: [root@zhaochj ~]# cat /etc/issue CentOS release 6.4 (Final) Kernel ...
- 大数据小白系列——HDFS(2)
这里是大数据小白系列,这是本系列的第二篇,介绍一下HDFS中SecondaryNameNode.单点失败(SPOF).以及高可用(HA)等概念. 上一篇我们说到了大数据.分布式存储,以及HDFS中的一 ...