day05:js基础——函数、作用域问题

2023-10-28

概述

本文主要介绍函数的概念、作用。以及在js中如何封装一个函数,并且会讲解变量作用域的问题,js预解析问题。配合demo让我们快速上手js函数。

1. 函数

1.1 函数概念,函数作用,函数构成。

函数概念: 函数是一种可重复使用的代码块,用于执行特定的任务。
函数作用:

1.代码复用:将功能封装成函数,避免在程序中多次编写相同的代码。这有助于提高代码的可读性和维护性。

2.模块化:函数可以将复杂的操作分解为较小的部分,使程序更易于理解和维护。这有助于实现模块化编程,提高代码的可扩展性和可重用性。

3.抽象和封装:函数可以将数据和功能进行抽象,从而隐藏实现细节。这有助于降低模块间的耦合度,提高代码的灵活性和可维护性。

4.性能优化:通过将重复的计算逻辑封装成函数,可以减少程序中的重复计算,提高程序的性能。

函数构成: 函数一般由 函数名参数函数体代码返回值 四个部分组成。

1.2 定义函数、调用函数

在 js 中定义函数的关键字为: function
函数定义有两种方式: 声明式定义 、 赋值式定义
重点掌握声明式定义函数、赋值式定义了解即可,稍后会讲到区别
定义的函数名规则和规范与变量名一致,应做到见名知意。下面使用定义一个简单的函数用于实现1-n的累加和。

    // 声明一个getSum函数,用于实现1-n的累加和
     function getSum(n){              // n为参数
         var sum = 0                  // 用于进行累加   
         for(var i = 1; i<=n; i++)    
             sum += i
         return sum                   // 函数返回值
     }

     var res =  getSum(10)            // 调用函数
     console.log(res)                 // 打印结果
     
	 // 赋值式定义、了解即可
     var getSum_ = function (n){           
          var sum = 0                  
          for(var i = 1; i<=n; i++)    
              sum += i
          return sum                   
     }

在这里插入图片描述

步骤 说明
1 使用function定义名为getSum的函数
2 函数的参数[根据需求可不写,可写多个]
3 函数体代码[根据需求编写功能]
4 函数返回值[一般需要返回值]
5 函数调用[不调用函数不会执行]

声明式定义与赋值式定义在调用时写法相同。

1.3 函数参数

  1. 函数的参数

     形参: 形参是定义在函数中的变量,它用来接收函数调用时传递的值。`在js中不需要声明类型,可接受各种类型数据`
     实参: 实参是函数调用时传递给函数的实际值。
     在1.2小节中,步骤二的n就是一个形式参数, 步骤5的‘10’就是一个实际参数。
    
  2. 实参和形参的个数关系

     实参个数和形参个数相等 实参会从左往右一一给形参赋值
     实参个数小于形参个数 多出形参的值是undefined
     实参个数大于形参个数 多出实参没有任何作用
    

1.4 函数返回值

返回值关键字为: return , 且函数只可以有一个返回值
一个函数被调用后应该需要有一个返回值或者相应的文本提示!
作用: 函数调用之后得到的结果,可以用于下一步的运算或者判断
比如在js中提供的一些内置函数:

- var 变量1  = Number(数据) 
- var 变量2  = parseInt(数据)  
- var 变量3  = parseFloat(数据)
- 函数默认是没有返回值 他的返回值是undefined
- 如果函数需要有一个返回值 可以在函数定义的内部写一个return return后面的数据就会当成函数的返回值

1.5 js中的特殊函数

了解一下即可

   1. 匿名函数 -- 没有名字、多用于事件处理函数
   function(){

   }
   2.自执行函数、多用于封装插件库、用一个匿名将代码包裹、里面的变量均为局部变量
   (funtion (num){
      
   })(222)
   (function name(){
   
   })()

1.6 函数demo

1.使用函数封装一个简易计算器

    /* 
         calc('+', 1, 2) // 3
     */
     function counter(operator, num1, num2){
         var res = 0
         if(operator==='+'){
             res = num1+num2
         }else if(operator==='-'){
             res = num1-num2
         }else if(operator==='*'){
             res = num1*num2
         }else if(operator==='/'){
             res = num1/num2
         }else{
             res = '你输入有误!'
         }
         return res
     }   
     console.log(counter('+',5,2)) 
     console.log(counter('-',5,2)) 
     console.log(counter('*',5,2)) 
     console.log(counter('/',5,2)) 

以上是使用js实现简易计算器, 函数名为counter、形式参数有三个operator、num1、num2,形式参数的作用也在告诉我们如何去使用这个函数,应该传入什么数据,该函数有一个返回值 res用来保存计算结果并且返回给调用处。console.log(counter(‘+’,5,2)) 直接将返回值打印到控制台。

2. 变量作用域

在学习函数时,应给变量划分为两大类:
1. 全局变量: 作用域为全局作用域,指的是在函数外部定义的变量,它们可以在整个程序中被访问和使用。
2. 局部变量: 作用域为局部作用域,指的是在函数内部定义的变量,它们只能在函数内部被访问和使用。在函数内部定义的变量称为函数参数和函数内部的变量。

		// 全局变量
 		var num1 = 1, num2 = 2
        function func1(){
            num1++
            // 局部变量
            var num2 = 3, num3 = 3
            num2++
            console.log(num1)
            console.log(num2)
        }
        func1()
        console.log(num1)
        console.log(num2)
        console.log(num3)

在这里插入图片描述根据打印的结果发现,函数内部输出的num1与外部输出的num1值相同,num1++使用的是外部的全局变量num1,而函数内部num2++以及内部输出的num2使用的是局部变量num2并没有改变全局变量num2,内部定义的num3在函数体外部也无法访问。这与全局作用域和局部作用域对应。
需要注意的是: 当函数内部有定义的变量会优先使用内部定义的,遵循就近原则。当函数内部无定义就会向包裹它的上个作用域寻找直到全局作用域,若还没有就是没定义该变量,此时会报错 xxx is not defined

若外部,内部均无var声明的num,此时浏览器会将num4解析为全局变量。

     function func1(){
          num4 = 6
          console.log(num4)
      }
      console.log(num4)

在这里插入图片描述

3. js中的预解析

预解析:当JavaScript引擎解析脚本时,他会在预编译阶段对所有声明的变量和函数进行处理,并且是先预声明变量,再预定义函数!

  • 内容:(预解析做了哪些事情)
    1. 会将声明式的函数提前定义
    2. 会将var声明的变量提前定义;只是定义提前没有将赋值提前
  • 影响:(预解析有什么样的影响)
    1. 声明式函数可以提前调用
    2. var声明的变量可以提前使用但是使用的值是undefined

3.1 声明式定义与赋值式定义的区别

        function print(){
            console.log('我是声明式定义')
        }
        print()

        var print_ = function (){
            console.log('我是赋值式式定义')
        }
        print_()

在这里插入图片描述这样似乎并没有区别, 我们将调用语句均提前看一下!
在这里插入图片描述提前后发现声明式正常调用,赋值式报错无该方法,这是为什么呢?
这里就和js的预解析有关系了,预解析将声明式函数提前执行,所以提前调用也可以查的到,但赋值式将print_解析成了一个变量,我们说预解析只会提前声明var关键字定义的变量但不会提前赋值,所以此时只能找到值为undefined的print_变量而不是一个函数

函数还有一个特殊用法 递归 由于用法特殊所以在后续进行讲解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

day05:js基础——函数、作用域问题 的相关文章

  • 从 thymeleaf 获取数据到模态引导程序、jquery

    我正在尝试获取模态视图的 id 这是为了更新 onclick 元素 但我找不到方法 知道如何为 boostrap 5 完成此操作 或我可以用其他方法吗 谢谢 tr a inactivate a div class modal fade mo
  • Web 串行 API - 未捕获(承诺中)DOMException:无法打开串行端口/所需成员 baudRate 未定义

    下面的代码可以在我的 Xubuntu 机器上运行 但现在我在 Kubuntu 上 它不再工作了 它不会打开端口 Arduino IDE 工作正常 可以向开发板写入代码 并且我可以在 Chrome 中选择设备 Arduino Uno 但当我尝
  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 我想检查 $('#td1').text() === "x" 是否?

    我想检查innerHtml是否有X或O 所以我不能再次添加任何其他东西 但它不起作用 添加检查代码后它就停止了 我在这里尝试做一个简单的XO游戏来更熟悉javascript和jquery 我也不确定是否可以用 jQuery 做到这一点
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • Meteor:应用程序无法在 0.9.1.1 版本上运行

    出现类似错误 Error TypeError undefined is not a function evaluating Template create anonymous function iron dynamic template j
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • fullCalendar 未显示正确的结束日期

    我正在看调试页面 http jsbin com wukofacaxu edit js outputFullCalendar 官方网站的 我想安排一个活动时间为 22 09 2015 至 30 09 2015 dd mm yyyy 但它只显示

随机推荐

  • 论文解读:PRINCE: Prefix-Masked Decoding for Knowledge Enhanced Sequence-to-Sequence Pre-Training

    论文解读 PRINCE Prefix Masked Decoding for Knowledge Enhanced Sequence to Sequence Pre Training Paper https aclanthology org
  • java1.7 0 45_Ubuntu下安装jdk1.7.0_45

    Ubuntu上安装jdk的 tar gz包 首先将 tar gz解压 具体方法为 tar xzvf tar gz 下面以我自己的安装版本 jdk1 7 0 45 为例 1 解压安装文件 tar xzvf jdk 7u45 linux x64
  • tensorflow不同版本对应的Python 版本,cuDNN版本,CUDA版本

    welcome to my blog 原图地址 Linux下的对应版本 macOS下的对应版本
  • MATLAB实现周期信号的傅里叶级数的展开

    MATLAB小白 不足之处还请多指教 设周期函数的波形为 求该周期信号的傅里叶级数展开式 并画出傅里叶展开后的波形 我们通过信号与系统的学习可以知道 周期函数可以通过一系列的三角函数的线性组合来逼近 如下图所示 首先我们可以通过三角函数的正
  • Mac下选择适合Unity的IDE

    以前都是Windows下使用Unity的 配合强大的visualstudio 写起代码来简直不要太爽 当我切换到Mac平台后 就感觉写代码的感受一下子回到了解放前 目前我尝试以下几种解决方案 终于让我写代码 1 vistualstudio
  • java.net.UnknownHostException完美解决。

    生产者会向Eureka注册 生产者如果部署在本机上 只需要部署以下参数即可 eureka instance instance id thisiswsgs01 设置服务描述 消费者只需要通过 http thisiswsgs01 user 1即
  • pubmed 影响因子_如何在Pubmed利用影响因子筛选文献?

    前几天给大家介绍了Pubmed上的2个神器 不知道的同学可以返回去看原文 两大神器 让你的PubMed飞起来 直接显示影响因子 Sci Hub链接 分区 用完之后是不是觉得方便了许多 今天 再给大家介绍一个使用Pubmed时候的小窍门 在P
  • UVA 401 Palindromes 题解

    Palindromes A regular palindrome is a string of numbers or letters that is the same forward as backward For example the
  • 制造企业有没有APS系统?生产车间如何计划排程和安排生产计划的?

    生产车间从组织职能上来说是以生产为重点的部门 生产计划应该由生产计划部来安排 如果从职能上来说 生产计划和生产车间放在一起会产生类似又当运动员又当裁判员的角色一样 从管理角度来看 生产计划和生产管理需要分开 原则上一个属于计划调度部门 一个
  • 记录一下实体类模型(Entity)的常用注解

    1 Data lombok注解 Data 注解的主要作用是提高代码的简洁 使用这个注解可以省去代码中大量的get set toString 等方法 2 TableName MybatisPlus注解 TableName注解主要是实现实体类型
  • 树莓派外设小开发(继电器、语音模块、超声波模块)

    wiringPi库安装与查看 首先要了解wiringPi库 wiringPi是一个很棒的树莓派IO控制库 使用C语言开发 提供了丰富的接口 GPIO控制 中断 多线程 等等 验证wiringPi的是否安装成功 输入gpio v 会在终端中输
  • 单片机C语言常用的头文件与库函数

    单片机C语言常用的头文件与库函数 以下头文件与库函数 只用头文件包含以下相应头文件即可调用 持续更新中 Intrins h头文件 函数名 函数原型 功能 返回值 crol unsigned char crol unsigned char v
  • 计算机密码输入正确,Win10输入正确密码却提示“密码不正确”如何解决

    在使用windows10系统过程中 很多用户都会遇到一些奇怪的问题 比如 有用户反馈开机登录win10的时候输入正确的登入密码 却碰到 密码不正确 请确认您的微软账户密码正确 的错误提示 无法登录 是怎么回事呢 在出现该问题的时候首先我们可
  • QT定时器的几种用法

    一 自定义定时器 定义一个定时器对象 绑定自定义槽函数 也可以定义定时器对象指针 这样可以一次性让多个定时器绑定同一个槽函数 头文件中加入 QTimer myTimer void myTimerEvent 自定义定时处理槽函数 在需要启动的
  • TCP的三次握手与四次挥手以及面试常见题

    TCP 是什么 TCP Transmission Control Protocol 传输控制协议 是一种面向连接的 可靠的 基于字节流的传输层通信协议 而且TCP是全双工模式 面向连接 你和你女朋友聊天是面向连接的 只有连接起来才可以通信的
  • 【Jmeter】什么是BeanShell?

    一 什么是BeanShell BeanShell是用Java写成的 一个小型的 免费的 可以下载的 嵌入式的Java源代码解释器 JMeter性能测试工具也充分接纳了BeanShell解释器 封装成了可配置的BeanShell前置和后置处理
  • 花生壳 linux客户端 命令

    phddns start service sshd status phddns status phddns version
  • HJ32密码截取

    有一定难度 难在考虑不周全 最后还是看了别人提到的方法 自己独立实现了一下 可能没有别人的简洁 但是易懂 调试的时候有些小毛病 但自己解决了 原因不是很清楚 最后总结里会提到 目标 在输入的字符串里找到对称的且是最长的那个字符串 思路 参考
  • 【Zabbix实战之部署篇】Zabbix使用SNMP监控Linux系统

    Zabbix实战之部署篇 Zabbix使用SNMP监控Linux系统 一 SNMP协议介绍 1 SNMP协议简介 2 SNMP协议特点 二 实践环境介绍 三 检查Zabbix监控平台环境 1 检查Zabbix相关组件容器状态 2 检查Zab
  • day05:js基础——函数、作用域问题

    js函数 作用域问题 概述 1 函数 1 1 函数概念 函数作用 函数构成 1 2 定义函数 调用函数 1 3 函数参数 1 4 函数返回值 1 5 js中的特殊函数 1 6 函数demo 2 变量作用域 3 js中的预解析 3 1 声明式