博客列表 >js中的函数与闭包

js中的函数与闭包

风车
风车原创
2022年07月28日 16:22:03315浏览

函数

函数的参数类型与返回值

函数的参数

function hello(c){ return c; };
在上方的代码中c就是函数的参数,return c 就是函数的返回值
函数的参数不是一成不变的,会出现各种各样的情况
1.参数不足:在声明函数和输出是都没有赋予参数具体的值,这种情况下可以给参数一个默认值
function hello(c='默认值'){ return c; };
2.参数过多:在输出是给了一个参数很多个值
function hello(c='默认值'){ return c; }; console .log(hello(1,2,3,4));
这样的情况可以使用 … 将多个参数压缩成一个数组,然后输出
function hello(...c){ return c; }; console .log(hello(1,2,3,4));
… 这个语法在函数声明时可以将参数压缩成数组然后输出,在函数调用时可以将数组展开
const a =['老师','学生','校长']; console.log(...a);

函数的返回值

函数的返回值默认是单值返回,但是实际的业务中有时会要求多值返回,这是后就需要将多个返回的值包装在一个容器中返回
一共有两个容器,分别是数组和对象

数组

let f =()=>[1,2,3,4,5,6]; console.log(f());

对象
  1. h=()=>{
  2. a:1;
  3. b:2;
  4. };
  5. console.log(h());

模板字面量和模板函数

模板字面量

在一个字符串中,出现占位符,则这个字符串为模板字符串
占位符:占位符可以是变量,插值,表达式

  1. let username ='朱老师';
  2. // 声明模板字符串 用反引号 在esc键下面
  3. // 占位符用${} 包围
  4. console.log (`hallo ${username}`);
  5. // 10+40=50 其中50 用${10+40}表示,会计算出结果 这就叫插值
  6. console.log(`10+40=${10+40}`);
  7. // 在其中加入判断表达式
  8. // 在字面量中写入判断表达式,则可以输出结果
  9. let a =20;
  10. console.log(`${a>18?`成年`:`未成年`}`);
模板函数

使用模板字面量作为参数的函数,叫做模板函数
模板函数的声明和普通函数一样,但是调用时要用模板字符串作为参数
在模板函数中必须要有两个参数
1.第一个参数是用来存储当前模板字面量中的字符串组成的数组
2.第二个参数是用来存储模板字面量中的插值列表
例如 function a (参数1,参数2){};

  1. function a (str,...ar){
  2. console.log(str,ar);
  3. }
  4. let name='手机';
  5. let num=20;
  6. let price=55;
  7. a`名称:${name},数量:${num},单价:${price},`

代码解释 首先声明一个函数 a 是一个模板函数 里面有参数一 str(存储字符串) ar(存储字符串中的插值) …是多个参数压缩成数组

然后声明三个变量 最后调用模板函数a 将这三个变量作为插值,等待函数调用

闭包

闭包的形成条件

首先在一个函数中有三种不同的变量

  1. let d = 40;
  2. let fn = function(a,b){
  3. // a,b是参数变量
  4. // 下面的c是私有变量,只能在函数内部访问
  5. let c =30;
  6. // d 是函数外部变量:也叫自由变量
  7. return a + b+c+d;
  8. };

接下来就是闭包的形成条件
1.必须是一个父子函数
2.在子函数中调用了父函数中的参数,
达到以上两个条件,闭包形成

闭包的访问方法

  1. h = function(a){
  2. let d= function(f){
  3. // a是父函数中的参数,b是子函数中的参数
  4. return a*f;
  5. }
  6. // 在父函数中返回这个子函数
  7. return d;
  8. }
  9. console.log(h(20)(10));
  1. fn = function(a){
  2. // 第一级函数 可以调用参数a
  3. return function(b){
  4. // 第二级函数 可以调用参数a,b
  5. return function(c,d){
  6. // 第三级函数,可以调用参数a,b,c
  7. return a+b+c+d;
  8. }
  9. }
  10. }
  11. // 传入参数的方法
  12. // 使用闭包的时候,可以将函数参数调用时 的多个参数分开传入
  13. console.log(fn(10)(20)(30,40));
  14. // 上面的fn 代表一级父函数 每一个括号表示每一级函数的参数
  15. // 如果某一级函数有多个参数,就和正常的一样 用逗号隔开
  16. // 简化上面的函数
  17. fn=a=>b=>(c,d)=>a+b+c+d;
  18. console.log(fn(20)(20)(30,40));

纯函数

当一个函数不需要调用外部变量的时候,这个函数就叫纯函数了

  1. let dis= 0.75;
  2. function a(d){
  3. return d*dis;
  4. }
  5. console.log(a(50));

上面这个函数就不是一个纯函数,因为他调用了函数外的变量dis

如果要将他变成一个纯函数,只需要将这个外部变量,通过参数的方式传入函数中就行

  1. let dis= 0.75;
  2. function a(d,dis){
  3. return d*dis;
  4. }
  5. // 将外部的参数直接转成函数的自带参数 然后调用
  6. // 调用是直接输入参数名 不用给值
  7. console.log(a(50,dis));
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议