前端开发系列118-进阶篇之Call by sharing(值传递还是引用传递)
在 JavaScript 语言中 ,函数参数传递的是「值」而非「引用」,即我们使用的是值传递的方式,关于这一点,我们可以通过下面这段简短的代码来进行说明。
/* 1、变量声明 */
let x = 100;
/* 2、函数声明 */
function changeX(x) {
x = 200;
}
/* 3、函数调用 */
changeX(x);
/* 4、打印输出 */
console.log(`x = ${x}`); /* x = 100 */
/* +++++++++++++= */
/* 测试代码-A */
let o1 = { name: "Yong" };
function change_A(o1) {
/* 注解:此处的o1为函数内部的局部参数(临时变量) */
o1.name = "Xia"
}
change_A(o1);
console.log(`o = `, o1); /* o1 = { name: 'Xia' } */
/* 测试代码-B */
let o2 = { name: "Yong" };
function change_B(o2) {
/* 注解:此处的o2为函数内部的局部参数(临时变量) */
o2 = { age: 18 };
}
change_B(o2);
console.log(`o = `, o2); /* o = { name: 'Yong' } */
在上面的代码中,有几个点需要进行说明。在 changeX() change_A() change_B()中的x | o1 | o2这三个变量用的都是形参,也就是说函数内部的这三个变量都是局部变量,它们区别于外部的全局变量是临时的。当函数调用时通过 实参 ——> 形参 来创建和赋值,函数执行完后这些局部变量就会被销毁。
函数调用时候都做了些什么?
[1] 把实参的值赋值给形参,相当于在函数中执行下面的代码
let x = x; <!-- 把 x 这个变量保存的内容(数字-100)拷贝一份给左边变量存储 -->
let o1 = o1; <!-- 把 o1 这个变量保存的内容(指针-对象)拷贝一份给左边变量存储 -->
let o2 = o2; <!-- 把 o2 这个变量保存的内容(指针-对象)拷贝一份给左边变量存储 -->
[2] 执行函数体中的代码
通过/* 测试代码-A */和/* 测试代码-B */的对比,我们可以知道JavaScript 函数是值传递的,如果 JavaScript 函数是引用传递的,那么/* 测试代码-B */执行后打印的结果应该是o = { age: 18 }。
前端开发系列118-进阶篇之Call by sharing(值传递还是引用传递)的更多相关文章
- openlayers5-webpack 入门开发系列一初探篇(附源码下载)
前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...
- leaflet-webpack 入门开发系列一初探篇(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- 【Windows10 IoT开发系列】配置篇
原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...
- ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 死磕面试系列,Java到底是值传递还是引用传递?
Java到底是值传递还是引用传递? 这虽然是一个老生常谈的问题,但是对于没有深入研究过这块,或者Java基础不牢的同学,还是很难回答得让人满意. 可能很多同学能够很轻松的背出JVM.分布式事务.高并发 ...
- 【webpack 系列】进阶篇
本文将继续引入更多的 webpack 配置,建议先阅读[webpack 系列]基础篇的内容.如果发现文中有任何错误,请在评论区指正.本文所有代码都可在 github 找到. 打包多页应用 之前我们配置 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- 旨在脱离后端环境的前端开发套件 - IDT Server篇
IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...
- 前端开发【第2篇:CSS】
鸡血 样式的属性多达几千个,但别担心,按照80-20原则,常用的也就几十个,你完全可以掌握它. Css初识 HTML的诞生 早期只有HTML的时候为了让HTML更美观一点,当时页面的开发者会把颜色写到 ...
- [置顶]【实用 .NET Core开发系列】- 导航篇
前言 此系列从出发点来看,是 上个系列的续篇, 上个系列因为后面工作的原因,后面几篇没有写完,后来.NET Core出来之后,注意力就转移到了.NET Core上,所以再也就没有继续下去,此是原因之一 ...
随机推荐
- 1、 为什么软件开发周期总是预估的2~3倍? 2、什么是分而治之? 3、了解 WBS
1.为什么软件开发周期总是预估的2~3倍? 首先,软件开发中经常会有需求变更的情况,客户或者利益相关者可能会提出新的需求或者改变现有的需求,这就得调整计划,增加了开发时间.其次,开发人员的技术和经验也 ...
- kali网卡消失解决
问题:kali网卡消失解决如图 解决: 1.查看配置文件 └─# cat /etc/network/interfaces # This file describes the network inter ...
- Python3循环结构(二) while循环
Python3 while循环 当循环次数无界时通常会使用while循环. 1.使用while循环输出九九乘法表 i=1 while i < 10: j = 1 while j < i + ...
- Dify 架构全景:从模块设计到部署实践的完整指南
项目概述 Dify 是一个开源的 LLM 应用开发平台,提供直观的界面,结合了AI Agent工作流.RAG 管道.智能体能力.模型管理和可观察性功能等,使用户能够快速从原型转向生产环境.Dify 允 ...
- codeup之学生查询
Description 输入n个学生的信息,每行包括学号.姓名.性别和年龄,每一个属性使用空格分开.最后再输入一学号,将该学号对应的学生信息输出. Input 测试数据有多组,第一行为样例数m.对于每 ...
- C# 获取磁盘或硬盘信息的坑,存在未就绪(IsReady = false)导致异常的问题
最近测试组小伙伴在用外接扩展坞链接有线网络,发现好几个程序在获取磁盘信息的时候都直接报错.这让我很奇怪,拉取了现场的日志. 由于这个模块的代码已经很稳定,好久没修改过了,之前一直测试都没有问题的,然后 ...
- Spring Boot线程池简单监控|转
背景 在我们实际项目开发中,常常会为不同优先级的任务设置相对应的线程池.一般我们只关注相关池的相关参数如核心线程数据,最大线程数据等等参数,容易忽略了对线程池中实际运行情况的监控. 综上所述:线程 ...
- RabbitMq安装、配置
#安装 apt install rabbitmq #启动 rabbitmqctl start_app #查看状态 rabbitmqctl status #退出 rabbitmqctl stop #gu ...
- Helm仓库管理
概述 官方文档:https://helm.sh/zh/docs/topics/chart_repository/ 官方仓库:https://artifacthub.io/ Helm 仓库(Reposi ...
- 关于cc1链-lazymap版复现
关于cc1链-lazymap版复现 思路,在cc链中最重要的其实是transform方法;其反射调用执行的性质+transformchain性质,导致可以通过构造反射调用链子,也就是Runtime.e ...