学习笔记整理-JS-06-函数

一、函数基本使用

1. 什么是函数

  • 函数就是语句的封装,可以让这些代码方便地被复用。
  • 函数具有"一次定义,多次调用"的优点。
  • 使用函数,可以简化代码,让代码更具有可读性。

2. 函数的定义和调用

  • 和变量类似,函数必须先定义然后才能使用

  • 使用function关键字定义函数,function是"功能"的意思。

      function fun() {// 函数体语句}
    
    • function:表示定义函数。
    • fun:函数名,函数名必须符合JS标识符命名规则。
    • ():圆括号中是形参列表,即使没有形参,也必须书写圆括号。
    • {}:大括号中就是函数体语句。
      var fun = function () {// 函数体语句}
    
    • function ():匿名函数
  • 函数的调用

    • 执行函数体中的所有语句,就称为"调用函数"
    • 调用函数非常简单,只需在函数名字后书写圆括号对即可
          fun()  // 调用函数,圆括号中是实参列表,如果没有实参,也要书写圆括号。
      
      fun.png
  • 函数声明的提升

    • 和变量声明提升类似,函数声明也可以被提升

         fun();function fun() {alert('函数被执行');} 
      
      • function fun()在预解析阶段会被提升。
    • 函数优先提升

      fun-1

3. 函数的参数和返回值

  • 参数是函数内的一些待定值,在调用函数时,必须传入这些参数的具体值
  • 函数的参数可多可少,函数可以没有参数,也可以有多个参数,多个参数之间需要用逗号隔开。
  • 函数的参数
      function add(a, b) { // 圆括号中定义"形式参数"var sum = a + b;console.log('两个数字的和是' + sum); }add(3, 5); // 调用函数传入"实际参数"
    
    • 形参和实参个数不同的情况
      fun-2
    • arguments
      • 函数内arguments表示它接收到的实参列表,它是一个类数组对象
      • 类数组对象:所有属性均为从0开始的自然数序列,并且有length属性,和数组类似可以用方括号书写下标访问对象的某个属性值,
        但是不能调用数组的方法。
  • 函数的返回值
    • 函数体内可以使用return关键字表示"函数的返回值"
          function sum(a, b) {return a + b; // 函数的返回值}var result = sum(3, 5); // 函数的返回值可以被变量接受
      
    • 调用一个有返回值的函数,可以被当做一个普通值,从而可以出现在任何可以书写值的地方。
          function sum(a, b) {return a + b;}var result = sum(3, 4) * sum(2, 6);
      
          function sum(a, b) {return a + b;}var result = sum(3, sum(4, 5));
      
    • 遇见return即退出函数
      • 调用函数时,一旦遇见return语句则会立即退出函数,将执行权交给调用者。

二、函数算法题

1. 寻找喇叭花数

  • 喇叭花树是这样的三位数:其每一位数字的阶乘之和恰好等于它本身。即abc = a! + b! + c!,其中abc表示一个三位数。试寻找所有喇叭花树。

  • 思路:将计算某个数字的阶乘封装成函数,这样可以让问题简化。

          // 计算一个数字的阶乘function factorial(n) {// 累乘器var result = 1;for (var i = 1; i <= n; i++) {result *= i;}return result;}// 穷举法,从100到999寻找喇叭花数for (var i = 100; i <= 999; i++) {// 把数字i变为字符串var i_str = i.toString();// abc分别表示百位、十位、个位var a = Number(i_str[0]);var b = Number(i_str[1]);var c = Number(i_str[2]);// 根据喇叭花数的条件,来判断if(factorial(a) + factorial(b) + factorial(c) == i){console.log(i);}}      
    
  • sort内置排序函数

    • 数组排序可以使用sort()方法,这个方法的参数又是一个函数。
          var arr = [33, 22, 55, 11];arr.sort(function (a, b) {});
      
    • 这个函数中的a、b分别表述数组中靠前和靠后的项,如果需要它们交换位置,则返回任意正数;否则就返回负数。
         var arr = [33, 22, 55, 11];arr.sort(function (a, b) {if (a > b) {return 1;} else {return -1;}}) // 从小到大arr.sort(function (a, b) {return a - b; })// 从大到小arr.sort(function (a, b) {return b - a;})
      

三、递归

1. 什么是递归

  • 函数的内部语句可以调用这个函数自身,从而发起对函数的一次迭代。在新的迭代中,又会执行调用函数自身的语句,从而又产生一
    次迭代。当函数执行到某一次时,不再进行新的迭代,函数被一层一层返回,函数被递归。
  • 递归是一种较为高级的变成技巧,它把一个大型复杂的问题层层转化为一个原问题相似较小的问题来解决。
  • 递归的要素
    • 边界条件:确定递归到何时终止,也称为递归的出口。
    • 递归模式:大问题是如何分解为小问题的,也称为递归体。

2. 递归常见算法

  • 斐波那契数列
    • 斐波那契数列是这样的数列:1、1、2、3、5、8、13、21。
    • 数列下标为0和1的项的值都是1,从下标为2的项开始,每项等于前面两项的和。
      @code

3. 实现深克隆

@code

四、全局变量和局部变量

  • 变量作用域:JavaScript是函数作用域编程语言:变量只在其定义时所在的function内部有意义。

      function fun() {var a = 10;}fun();console.log(a); // 报错
    
    • 变量a是在fun函数中被定义的,所以变量a只在fun函数内部有定义,fun函数就是a的"作用域"变量a被称为局部变量
  • 全局变量

    • 如果不将变量定义在任何函数的内部,此时这个变量就是全局变量,它在任何函数内都可以被访问和更改。
        var a = 10;function fun() {a++;console.log(a); // 输出11}fun();console.log(a); // 输出11
      
      • 变量a没有定义在任何函数内部,它是"全局变量"。
  • 遮蔽效应

    • 如果函数中也定义了和全局同名的变量,则函数内的变量会将全局的变量"遮蔽"
         var a = 10;function fun() {var a = 5;a++;console.log(a); // 输出6}fun();console.log(a); // 输出 10
      
      • 局部变量a将全局变量a"遮蔽"了
    • 注意考虑变量声明提升的情况
         var a = 10;function fun() {a++;        // 局部变量a被自增1,a此时是undefined,自增1结果是NaNvar a = 5;  // 局部变量a会被提升到a++之前, 重新将a赋值为5console.log(a); // 输出5}fun();console.log(a); // 输出10
      
  • 形参也是局部变量

      var a = 10;function fun(a) {a++;console.log(a); // 输出8}fun(7);console.log(a);  // 输出10
    
    • 形参a也是函数内部的局部变量

五、作用域链

  • 函数的嵌套:一个函数内部也可以定义一个函数。和局部变量类似,定义在一个函数内部的函数是局部函数。

        function fun() {function inner() {console.log('你好');}inner(); // 调用内部函数}fun();  // 调用外部函数
    
  • 作用域链

    • 在函数嵌套中,变量会从内到外逐层寻找它的定义。
        var a = 10;var b = 20;function fun() {var c = 30;function inner() {var a = 40;var d = 50;console.log(a, b, c, d); // 使用变量时,JS会从当前层开始,逐层向上寻找定义。}inner();}fun();
      
    • 不加var将定义全局变量
      • 在初次给变量赋值时,如果没有加var,则将定义全局变量。
          function fun() {a = 3;}fun();console.log(a); // 3
        
          var a = 1;var b = 2;function fun() {c = 3;var b = 4;b++;console.log(b); // 5c++;}fun();console.log(b); // 2console.log(c); // 4
        

六、闭包

  • 什么是闭包

        // 创建一个函数function fun() {// 定义局部变量var name = '张三';function innerFun() {alert(name);} return innerFun; // 返回了内部函数}var innerFun = fun(); // 内部函数被移动到了外部执行innerFun();
    
    • JavaScript中函数会产生闭包(closure)。闭包是函数本身该函数声明时所处的环境状态的组合。
      closure.png

    • 函数能够"记忆住"其定义时所处的环境,即使函数不在其定义的环境中被调用,也能访问定义时所处环境的变量。

  • 观察闭包现象

    • 在JavaScript中,每次创建函数时都会创建闭包
    • 但是,闭包特性往往需要将函数"换一个地方"执行,才能被观察出来。
  • 闭包的作用

    • 闭包很有用,因为它允许我们将数据与操作该数据的函数关联起来,这与"面向对象编程"有少许相似之处。
    • 闭包的功能:记忆性、模拟私有变量。
  • 闭包的用途[记忆性]

    • 当闭包产生时,函数所处环境的状态会始终保持在内存中,不会在外层函数调用后被自动清除。这就是闭包的记忆性。
    • 举例:创建体温检测函数checkTemp(n),可以检查体温n是否正常,函数会返回布尔值。
      但是不同的小区有不同的体温检测标准,比如A小区体温合格线是37.1℃,而B小区体温合格线是37.3℃
          function createCheckTemp(standardTemp) {function checkTemp(n) {if (n <= standardTemp) {alert('你的体温正常');} else {alert('你的体温偏高');}}return checkTemp;}var checkTemp_A = createCheckTemp(37.1);var checkTemp_B = createCheckTemp(37.3);checkTemp_A(37.2);checkTemp_B(37.0);checkTemp_A(37.5); 
      
  • 闭包的用途[模拟私有变量]

    • 请定义一个变量a,要求是能保证这个a只能被进行指定操作(如加1、乘2),而不能进行其他操作。
        // 封装一个函数,这个函数的功能就是私有化变量function fun() {// 定义一个局部变量avar a = 0;return {getA: function() {return a;},add: function () {a++;},pow: function () {a *=2;}   }  }var obj = fun();// 如果想在fun函数外面使用变量a,唯一的方法就是调用getA()方法。console.log(obj.getA());   
      
  • 闭包的注意点

    • 不能滥用闭包,否则会造成网页的性能问题,严重时可能导致内存泄漏。所谓内存泄漏是指程序中已动态分配的内存由于某种原因未释放或
      无法释放。
  • 闭包的一道面试题

      function addCount() {var count = 0;return function () {count = count + 1;console.log(count);};}var fun1 = addCount();var fun2 = addCount();fun1(); // 1fun2(); // 1fun2(); // 2fun1(); // 2 
    

七、什么是IIFE

  • IIFE(Immediately Invoked Function Expression,立即调用函数表达式)是一种特殊的JavaScript函数写法,
    一旦被定义,就立即被调用

      (function () {statements})();
    
    • 包裹function的括号:将函数变成表达式
    • ():运行函数
  • 形成IIFE的方法

    • 函数不能直接加圆括号被调用
         function () {alert(1)     }()
      
    • 函数必须转为函数表达式才能被调用。
        (function (){alert(1)})();+function () {alert(1)}(); -function () {alert(1)}();
      
  • IIFE的作用[为变量赋值]

    • 为变量赋值:当给变量赋值需要一些较为复杂的计算时(如if语句),使用IIFE显的语法更紧凑
      <!DOCTYPE html>
      <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
      </head><body><script>var age = 42;var sex = '女';var title = (function () {if (age < 18) {return '小朋友';} else {if (sex == '男') {return '先生';} else {return '女士';}}})();alert(title);</script>
      </body></html>
      
  • IIFE的作用[将全局变量变为局部变量]

    • IIFE可以在一些场合(如for循环中)将全局变量为局部变量,语法显得紧凑。
      <!DOCTYPE html>
      <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
      </head><body><script>var arr = [];for (var i = 0; i < 5; i++) {(function(i){arr.push(function () {alert(i);});})(i);}arr[0]();arr[1]();arr[2]();arr[3]();arr[4]();</script>
      </body></html>
      

八、内容难点

  • 什么是函数?函数为开发带来了哪些便利?
  • 函数的参数和返回值
  • 函数的相关算法题
  • 递归、递归算法题
  • 作用域和闭包
  • IIFE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/35968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter并发测试以后出现EOFError marshal data too short

Jupyter 并发测试以后出现EOFError: marshal data too short 背景 由于项目需求需要用户能进行网页在线运行python代码程序&#xff0c;调研后决定使用Jupyter的服务接口实现此功能&#xff0c;目前使用docker进行容器化部署&#xff0c;测试针对次服务进行并发测试。测试并发…

JimuReport积木报表 v1.6.0版本发布—免费的可视化报表

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

开源代码分享(13)—整合本地电力市场与级联批发市场的投标策略(附matlab代码)

1.引言 1.1摘要 本地电力市场是在分配层面促进可再生能源的效率和使用的一种有前景的理念。然而&#xff0c;作为一个新概念&#xff0c;如何设计和将这些本地市场整合到现有市场结构中&#xff0c;并从中获得最大利润仍然不清楚。在本文中&#xff0c;我们提出了一个本地市场…

中睿天下Coremail | 2023年第二季度企业邮箱安全态势观察

今日&#xff0c;中睿天下联合Coremail邮件安全发布《2023第二季度企业邮箱安全性研究报告》&#xff0c;对2023第二季度和2023上半年的企业邮箱的安全风险进行了分析。 一 垃圾邮件同比下降16.38% 根据监测&#xff0c;2023年Q2垃圾邮件数量达到6.47亿封&#xff0c;环比下降…

opencv图片灰度二值化

INCLUDEPATH D:\work\opencv_3.4.2_Qt\include LIBS D:\work\opencv_3.4.2_Qt\x86\bin\libopencv_*.dll #include <iostream> #include<opencv2/opencv.hpp> //引入头文件using namespace cv; //命名空间 using namespace std;//opencv这个机器视…

TypeScript项目中Axios的封装

目录 前言 一、axios中的常见类型 1. AxiosInstance 2. AxiosRequestConfig 3. AxiosResponse 4. AxiosError 二、axios封装步骤 三、封装后的完整代码 1. 基础封装 2. 高级封装 前言 为了实现统一的网络请求处理和管理&#xff0c;在日常开发中我们常常封装 axios&…

TiDB v7.1.0 跨业务系统多租户解决方案

本文介绍了 TiDB 数据库的资源管控技术&#xff0c;并通过业务测试验证了效果。资源管控技术旨在解决多业务共用一个集群时的资源隔离和负载问题&#xff0c;通过资源组概念&#xff0c;可以限制不同业务的计算和 I/O 资源&#xff0c;实现资源隔离和优先级调度&#xff0c;提高…

Patch SCN一键解决ORA-600 2662故障---惜分飞

客户强制重启库之后,数据库启动报ORA-600 2037,ORA-745 kcbs_reset_pool/kcbzre1等错误 Wed Aug 09 13:25:38 2023 alter database mount exclusive Successful mount of redo thread 1, with mount id 1672229586 Database mounted in Exclusive Mode Lost write protection d…

SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

目录 1、想达到的效果2、用户信息在微服务之间传递的两种途径3、用RuoYi-Cloud为例进行演示说明&#xff08;1&#xff09;网关将用户信息写在请求头中&#xff08;2&#xff09;业务微服务之间通过OpenFeign进行调用&#xff0c;并且将用户信息写在OpenFeign准备的请求头中&am…

香港站群服务器为什么适合seo优化?

​  香港站群为什么适合seo优化?本文主要从以下四点出发进行原因阐述。 1.香港站群服务器的优势 2.香港站群服务器与国内服务器的对比 3.多IP站群服务器的优势 4.香港站群服务器在SEO优化中的注意事项 1.香港站群服务器的优势 香港站群服务器是为了满足企业SEO优化需求而提供…

GD32F103VE使用DMA传输读取内部温度和参考电压值

GD32F103VE使用DMA传输读取内部温度和参考电压值。出厂CPU芯片不同&#xff0c;温度误差不同&#xff0c;不要纠结了。 GD32F103的ADC为12位AD转换器,ADC转换结果保存在16位数据寄存器中; 模拟输入通道&#xff1a; 16个外部模拟输入通道; 1个内部温度传感器通道(Vsense) 1个…

【electron】electron安装过慢和打包报错:Unable to load file:

文章目录 一、安装过慢问题:二、打包报错&#xff1a;Unable to load file: 一、安装过慢问题: 一直处于安装过程 【解决】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包报错&#xff1a;Unable to load…

camera hal|如何学习一个新平台

全网最具价值的Android Camera开发学习系列资料~ 作者:8年Android Camera开发,从Camera app一直做到Hal和驱动~ 欢迎订阅,相信能扩展你的知识面,提升个人能力~ 我自己目前从事的是android camera hal 的工作,工作上接触到的芯片平台要么是高通的,要么是mtk的。 其实…

c语言作业

作业1&#xff1a; 关于实参和形参 形参是实参的一份临时拷贝。 形参是在函数调用的时候才实例化&#xff0c;才开辟内存空间。 函数调用如果采用传值调用&#xff0c;改变形象不影响实参。 改变形参不是影响实参。 作业2&#xff1a; 函数调用exec&#xff08;&#xf…

C++QT教程3——手册4.11.1自带教程(笔记)——创建一个基于Qt Widget的应用程序

文章目录 创建一个基于Qt Widget的应用程序创建Text Finder项目素材文件 填补缺失的部分设计用户界面完成头文件完成源文件创建资源文件 编译和运行程序 参考文章 创建一个基于Qt Widget的应用程序 本教程介绍如何使用Qt Creator创建一个小型Qt应用程序&#xff0c;名为Text F…

电脑IP地址错误无法上网怎么办?

电脑出现IP地址错误后就将无法连接网络&#xff0c;从而无法正常访问互联网。那么当电脑出现IP地址错误时该怎么办呢&#xff1f; 确认是否禁用本地连接 你需要先确定是否禁用了本地网络连接&#xff0c;如果发现禁用&#xff0c;则将其启用即可。 启用方法&#xff1a;点击桌…

Spring 使用注解开发、代理模式、AOP

使用注解开发 在Spring4之后&#xff0c;要使用注解开发&#xff0c;必须要保证AOP的包导入了 项目搭建&#xff1a; 在配置文件中导入约束&#xff0c;增加注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…

uniapp把城市换成26个字母和城市排序

后端返回的数据 我们要得效果 <template><view><view v-for"(value,key) in cities" :key"key"><view style"color: red;"> {{ key }} </view><view style"border: 1rpx solid black;"><tex…

PostgreSql 备份恢复

一、概述 数据库备份一般可分为物理备份和逻辑备份&#xff0c;其中物理备份又可分为物理冷备和物理热备&#xff0c;下面就各种备份方式进行详细说明&#xff08;一般情况下&#xff0c;生产环境采取的定时物理热备逻辑备份的方式&#xff0c;均是以下述方式为基础进一步研发编…

Linux 基础

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 linux的目录结构 linux的文件系统采用树状的目录结构&#xff0c;在此结构的最上层是根目录“/”&#xff0c; 然后在此目录下再创建其他…