【亡羊补牢】JS灵魂之问 第14期 修炼内功 函数基础 形参实参映射关系,是什么?

本文主要是介绍【亡羊补牢】JS灵魂之问 第14期 修炼内功 函数基础 形参实参映射关系,是什么?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

有几天没有更新JS灵魂之问的专栏系列文章了,秋招季,也在忙着备战笔试面试。今天得空再来写一篇文章,本篇要讲解的内容是关于 函数基础 ,那今天这篇看能不能问倒你了,一起来探索一下吧。

仰望星空的人,不应该被嘲笑

文章目录

    • 引言
    • 函数基础
      • 函数种类、字面量
      • 形参实参映射
      • 作用域引入
      • 函数默认参数
    • 最后

函数基础

函数种类、字面量

开门见山,下面代码会输出什么,不知道小伙伴平常有咩有想过这类问题

var test = function test1() {var a = 1;console.log(a);
}
test()
test1()

答案是 1报错,报错信息如下:


这是为什么呢?实际上,我们申明了一个变量 test,把这个函数 test1赋给它的时候,就已经把这个变量赋予了函数的功能,调用 test()方法当然能够正常运行,输出 1。而对于表达式赋值,会自动忽略后面的函数名称,也就是说写与不写并不影响 test()方法的执行。不信,看看下面代码会输出什么?

var test = function() {var a = 1;console.log(a);
}
test() // 1

那这样,是不是说 test1完全没作用了,那写着干嘛,还多几个字符。当然不是!test1在函数体内部是可见的,而在外部却不可见,通过这样,我们就可以实现递归操作

var test = function() {var a = 1;console.log(a);
}

而对于上述代码,后面函数体没有名字,我们称之为 匿名函数,是不是有点印象了,原来就是这东西,哟西~

而通过这种方式赋值的表达式,我们称之为 匿名函数表达式,也称为 函数字面量,这些专有名词一出来,瞬间觉得有点逼格了有没有!

字面量这种东西,简单来说就是数据,例如下述,有数字字面量,字符串字面量,数组字面量等等。简单理解就是,对于赋值的过程,右边的数据就是字面量。

var a = 10
var b = '111'
var c = [1,2,3]

形参实参映射

补充:如何获取形参和实参对应的长度?

function test (a,b) {console.log(test.length)  // 形参的长度 2console.log(arguments.length) // 实参的长度 3
}
test(1,2,3)

我想小伙伴们应该清楚实参和形参是什么玩意,但是我们可以更改实参的值吗?例如下述代码,会输出什么呢?

function test(a, b) {a =3;console.log(arguments[0]);
}
test(1,2);

答案是 3,我们可以修改实参的值。

刚刚那题只是简单热个身,继续下一题吧,我们可以改变 b 的值吗?(提示:注意我并没有传对应实参哦~)

function test(a, b) {b = 3;console.log(arguments[1]);
}
test(1);

答案是 undefined,因此对于上一题表述,要修改一下:对于实参传递过来确定的值,我们是可以进行修改的,而如果实参并没有传递值过来,我们是不能进行修改的。这就是形参和实参的映射关系

简单解释一下形参和实参的映射关系,其实实参形参不能说是一类的,看上述代码,我们可以通过 arguments 来获取我们的实参,可以看做是一个数组里面的某一项值,而数组是存放堆内存的,而对应我们形参其实是存放在栈内存的,它们之间会有一个映射关系,并且是一对一对应的,上述我们实参没有对b进行赋值,尽管修改了形参,但改变不了我们的 arguments[1] 就是这个道理。(没有建立一对一映射关系)。

作用域引入

再来一道引申题,为后续内容做铺垫。下面 a b c 分别会输出什么?

a = 1;
function test1 () {var b = 2;console.log(a)  // function test2() {var c = 3console.log(b); // }test2();console.log(c); // 
}
test1();

答案是 1 2 报错,这就牵扯到 scope 问题了,简单理解就是函数内部能访问外面的变量,而函数外面却不能访问内部的变量,也就是闭包问题。(这个后文会提到)

函数默认参数

如果实参没有赋值,那么形参怎样设置默认参数呢?说到默认参数,我想你应该会想到如下代码:

function test(a = 1, b = 1) {console.log(a)console.log(b)
}
test() // 1 1

好的,上述问题算是开胃小菜,我们继续,我如果给 a 设定默认值,而 b 通过实参传递过来呢?可以实现吗?之前没有传参的话,不是默认打印 undefined吗,那我现在给 a 传递一个 undefined,是不是就会定为默认值。

function test(a = 1, b) {console.log(a)console.log(b)
}
test(undefined, 2)

答案是可以的,上述代码输出结果为 1 2。简单解释一下,在之前我们将了形参实参是有一个映射关系,对于堆内存 arguments 里面,如果给了 undefined,那么就会去栈内存形参里面找,如果不为 undefined,则会设置形参的默认值。(其实这是 es6 的语法了)

那么,可以用es5的方式实现一下吗?(当然可以,见代码)

function test(a, b) {a = arguments[0] || 1b = arguments[1] || 1console.log(a)console.log(b)
}
test(undefined, 2)

最后

文章产出不易,还望各位小伙伴们支持一波!

往期精选:

小狮子前端の笔记仓库

访问超逸の博客,方便小伙伴阅读玩耍~

学如逆水行舟,不进则退

这篇关于【亡羊补牢】JS灵魂之问 第14期 修炼内功 函数基础 形参实参映射关系,是什么?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/451523

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键