JavaScript基础-函数(完整版)

news2024/10/6 6:15:17

文章目录

    • 函数
      • 基本使用
      • 函数提升
      • 函数参数
        • arguments对象(了解)
        • 剩余参数(重点)
        • 展开运算符(...)
      • 逻辑中断
      • 函数参数-默认参数
      • 函数返回值-return
      • 作用域(scope)
        • 全局作用域
        • 局部作用域
        • 变量的访问原则
        • 垃圾回收机制
        • 闭包
      • 匿名函数
        • 函数表达式
        • 立即执行函数
      • 箭头函数
        • 箭头函数中的 this (重要)
      • ES6对象简写
    • 断点调试-进入函数内部

函数

  • 函数:是可以被重复使用的代码块。
  • 作用:函数可以把具有相同或相似逻辑的代码封装起来,有利于代码复用。

基本使用

  1. 定义函数(声明函数):function

  2. 调用函数:定义一个函数并不会自动执行它,需要调用函数。

    //声明函数
    function 函数名() {
        函数体
    }
    //调用函数
    函数名()
    
    //需求:封装一个函数,计算两个数的和
    function getSum() {
        let num1 = 1
        let num2 = 9
        console.log(num1 + num2)
    }
    getSum()
    
    //需求: 封装函数,计算1~100之间的累加和
    function getSum100() {
        let sum = 0
        for (let i = 1; i <= 100; i++) {
            sum += i
        }
        console.log(sum)
    }
    getSum100()
    

函数提升

  • 说明:
    • 函数提升:提升到当前作用域最前面;
    • 只提升声明,不提升调用;
    • 函数表达式不存在提升的现象,表达式相当于变量;
    • 函数提升能够使函数的声明调用更灵活

函数参数

  • 形参:声明函数时小括号里的叫形参
  • 实参:调用函数时小括号里的叫实参
  • 执行过程:把实参的数据传递给形参,提供给函数内部使用。
    在这里插入图片描述
function getSum(x,y) {
    console.log(x,y) //3 5
    return x + y
}
let res = getSum(3,5)
console.log(res) //8

注意:在js中,形参和实参的个数可以不一致。形参过多会自动填上undefined;实参过多,会忽略多余的实参。

建议:开发中保持形参和实参的个数一致。

arguments对象(了解)
  • arguments:是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参,但只存在于函数,外面无法使用。

  • 作用:动态获取函数的实参。

  • 可以通过for循环依次得到传递过来的实参。

剩余参数(重点)
  • 剩余参数: 允许我们将一个不定数量的参数表示为一个数组.

    简单理解:用于获取多余的实参,并形成一个真数组

  • **使用场景:**可以解决形参和实参个数不匹配的问题

<body>
    <script>
        function fn(a, b, ...c) {//剩余参数只能写在参数的最后面
            console.log(a + b, c) //c:真数据(数组)
        }
        fn(1, 2, 3, 4, 5)
    </script>
</body>
  • 剩余参数和 arguments 区别
    • ... 是语法符号,置于最末函数形参之前,用于获取多余的实参
    • 借助 … 获取的剩余实参,是个真数组
    • 箭头函数不支持arguments,但是可以使用剩余参数
    • 开发中,还是提倡多使用 剩余参数
展开运算符(…)
  • 展开运算符:将一个数组/对象进行展开
<body>
    <script>
        //展开运算符 
        // 数组
        const arr = [1, 2, 3]
        console.log(...arr)

        // 对象
        const obj = {
            uname: 'niuniu',
            age: 18
        }
        console.log({...obj})

        // 应用:数组的展开,求最大值
        console.log(Math.max(1, 2, 3, 9))
        console.log(Math.max(...arr))

        // 合并数组
        const arr1 = [4, 5, 6]
        const arr2 = ['haha', 'lala', 'xixixi']
        const arr3 = [...arr1, ...arr2]
        console.log(arr3)

        // 合并对象
        const obj1 = {
            uname: 'niuniu'
        }
        const obj2 = {
            age: 18
        }
        const obj3 = {
            ...obj1,
            ...obj2
        }
        console.log(obj3)
    </script>
</body>

逻辑中断

  • 逻辑中断:存在于逻辑运算符 &&|| 中,左边如果满足一定条件会中断代码执行,也称为逻辑短路。

  • 作用:解决参数形参传递的问题

  • 解释:

    在这里插入图片描述

function getSum(x,y) {
    //逻辑中断:如果 实参 没有传递给形参 x 和 y ,则会返回 0,而不是NaN
    x = x || 0
    y = y || 0
    console.log(x,y)
}
getSum(2) //2 0  => 如果没有逻辑中断,则返回 NaN
getSum(3,6) //3 6

函数参数-默认参数

  • 默认参数:可以给形参设置默认值。

  • 说明:默认值只会在 缺少实参传递实参为undefined 才会被执行。

  • 作用:解决参数形参传递的问题。

  • 与逻辑中断的区别:

    • 默认参数主要处理函数形参,比逻辑中断简单;

    • 逻辑中断除了参数,还可以处理更多的需求,例如,

      在这里插入图片描述

function getSum(x = 0,y = 0) {
    console.log(x,y)
}
getSum(4,1) //4 1
getSum(4)   //4 0

函数返回值-return

  1. 返回值:把处理结果返回给调用者。
  2. 注意:
    • 结束函数:return 会立即结束当前函数,后面的代码不会被执行。
    • 不要换行:在return关键字和被返回的表达式之间不允许使用换行符,否则自动补充分号。
    • 默认返回:可以没有return,这时默认返回值为undefined

作用域(scope)

  • 作用域:变量或者值在代码中可用性的范围.

  • 作用:提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

全局作用域
  1. 作用于所有代码执行的环境(整个script标签内部)或者一个独立的 js文件
  2. 变量:全局变量
  3. 全局变量 在任何区域都可以访问和修改。
局部作用域
  1. 函数作用域:作用于函数内部的代码环境。
  2. 块级作用域{} 大括号内部。
  3. 变量:局部变量
  4. 局部变量 只能在当前局部内部访问和修改。

注意:

  1. 如果函数内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐
  2. 但是有一种情况,函数内部的形参可以看做是局部变量。
变量的访问原则
  • 访问原则:在能够访问的情况下 先局部,局部没有 再找全局,总结:就近原则
//练习1
function f1 () {
    let num = 123
    function f2 () {
        console.log(num)    //123
    }
    f2()
}
let num = 234
f1()

// 练习2. 
let a = 1
function fn1() {
    let a = 2
    let b = '22'
    fn2()

    function fn2() {
        let a = 3
        fn3()

        function fn3() {
            let a = 4
            console.log(a)  //4
            console.log(b)  //'22'
        }
    }
}
fn1()
垃圾回收机制
  1. 垃圾回收机制(Garbage Collection),简称 GC
  • JS中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收。
  1. js环境种内存的生命周期:
    • 内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存。
    • 内存使用:即读写内存,也就是使用变量、函数等。
    • 内存回收:使用完毕,由垃圾回收器自动回收不再使用的内存。
  2. 说明:
    • 全局变量一般不会回收(关闭页面回收)
    • 一般情况下局部变量的值, 不用了, 会被自动回收掉
  3. **内存泄漏:**程序中分配的内存由于某种原因程序未释放或无法释放叫做内存泄漏。
闭包
  • 概念:一个函数对周围状态的引用捆绑在一起,闭包让开发者可以从内部函数访问外部函数的作用域。

简单理解:闭包 = 内层函数 + 外层函数的变量

  • 作用:实现数据的私有,避免全局污染,外层函数有可以访问里层函数变量。
  • 问题:内存泄漏
<body>
    <script>
        // 闭包 : 内层函数 + 外层函数的变量
        // function outer() {
        //     let  a = 1
        //     function f() {
        //         console.log(a)
        //     }
        //     f()
        // }
        // outer()

        // 案例:统计函数的调用次数
       function fn() {
        let count = 0
        function fun() {
            count++
            console.log(`fn函数调用了${count}`)
        }
        return fun
       }
       const f = fn()
       f()
  </script>
</body>

匿名函数

函数表达式
  1. 函数表达式:将匿名函数赋值给一个变量,并且通过变量名称进行调用。

  2. 使用场景:后期web api 阶段会使用。

  3. 注意:

    • 函数也是一种数据类型;
    • 函数表达式必须先定义后使用
  4. 语法:

    //定义
    let fn = function () {
        //函数体
    }
    
    //调用
    fn()
    
立即执行函数
  1. 场景介绍:避免全局变量之间的渲染。

  2. 语法:

    //方法1
    (匿名函数)();
    
    //方法2
    (匿名函数());
    
    //方法1
    (function () {
        console.log('niuniu')
    })();
    
    //方法2
    (function () {
        console.log('zhuzhu')
    }());
    

注意:多个立即执行函数要用 ; 隔开,前后都要,否则会报错。

箭头函数

  • 箭头函数比函数表达式更简洁的一种写法
  • 使用场景:箭头函数更适用于那些本来需要匿名函数的地方,写法更简单
  • 用法细节:
    • 当箭头函数只有一个参数时,可以省略参数的小括号,其余个数不能省略(没有参数也需要写小括号)
    • 当箭头函数的函数体只有一句代码 可以省略函数体大括号,这句代码就是返回值(可以不用写return)
    • 如果返回的是个对象,则需要把对象用小括号包裹
    • 箭头函数里面没有arguments,但是有剩余参数
<body>
    <script>
        //箭头函数 基本写法
        // const fn = () =>         //     console.log('我是箭头函数')
        // }
        // fn()

        // 细节写法
        // const fn = a => console.log(a)
        // fn(1)

        // const fn = a => a
        // const res = fn('niuniu')
        // console.log(res)

        // const fn = () => {
        //     const obj = {
        //         uname: 'niuniu',
        //         age: 18
        //     }
        //     return obj
        // }
        // const res = fn()
        // console.log(fn())

        // const fn = () => ({uname: 'niuniu', age: 18})
        // const res = fn()
        // console.log(res)

        const fn = (...arr) => {
            console.log(arr)
        }
        fn(1, 2, 3)
    </script>
</body>
箭头函数中的 this (重要)

以前函数中的this指向是根据如何调用来确定的。简单理解就是this指向调用者

箭头函数本身没有this,它只会沿用**上一层作用域的this **。

<body>
    <button>按钮</button>
    <script>
        //箭头函数的 this问题
        const btn = document.querySelector('button')
        // btn.addEventListener('click', () => {
        //     console.log(this) //箭头函数里的this是指向上一级作用域
        // })

        //定时器中使用,事件源,推荐使用箭头函数
        //需求:点击按钮禁用,三秒后启用
        btn.addEventListener('click', function () {
            btn.disabled = true
            setTimeout(() => {
                console.log(this)
                btn.disabled = false
            }, 3000)
        })
    </script>
</body>

注意:在开发中【使用箭头函数前需要考虑函数中 this 的值】

  1. 事件回调函数使用箭头函数时,this 为全局的 window,不太推荐使用箭头函
  2. 定时器里面的如果需要this,可以使用箭头函数

ES6对象简写

  1. 在对象中,如果属性名和属性值一致,可以简写只写属性名即可。

  2. 在对象中,方法(函数)可以简写

    <body>
        <script>
            // ES6对象属性和方法的简写
            const uname = 'niuniu'
            const age = 18
            // 对象属性
            const obj = {
                // uname: uname,
                // age: age
                uname,
                age,
                // 方法简写
                sing() {
                    console.log('hahahaha')
                }
            }
            console.log(obj)
            obj.sing()
        </script>
    </body>
    

断点调试-进入函数内部

在这里插入图片描述

  • F11 可以进入函数内部调试

  • 可以使用监视,来看数组的变化。

    在这里插入图片描述

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

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

相关文章

全自动内衣洗衣机什么牌子好?四大热门内衣洗衣机多角度测评

内衣洗衣机是近几年新兴的一种家用电器产品&#xff0c;正日益引起人们的重视。但是&#xff0c;面对市面上品牌繁多、款式繁多的内衣洗衣机&#xff0c;使得很多人都不知道该如何选择。身为一个数码家电博主&#xff0c;我知道这类产品在挑选方面有着比较深入的了解。为此&…

AIGC对设计师积极性的影响

随着科技的迅猛发展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;工具正逐渐深入设计的每个角落&#xff0c;对设计师的工作方式和思维模式产生了深远的影响。AIGC不仅极大提升了设计师的工作效率&#xff0c;更激发了他们的创新思维&#xff0c;为设计行业带来了翻…

好文阅读-日志篇

https://mp.weixin.qq.com/s/jABbG4MKvEiWXwdYwUk8SA 这里直接看最佳实践。 Maven 依赖 <dependencyManagement><dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.36…

聊聊 CTO 和 技术总监的区别

前言 CTO&#xff08;Chief Technology Officer&#xff09;&#xff0c;是首席技术官的意思。 技术总监&#xff0c;顾名思义&#xff0c;就是负责指导和监督公司的技术团队&#xff0c;确保技术和产品的开发与创新顺利进行。 有的软件公司同时有 CTO 和技术总监&#xff0…

第二届计算机、视觉与智能技术国际会议(ICCVIT 2024)

随着科技的飞速发展&#xff0c;计算机、视觉与智能技术已成为推动现代社会进步的重要力量。为了汇聚全球顶尖专家学者&#xff0c;共同探讨这一领域的最新研究成果和前沿技术&#xff0c;第二届计算机、视觉与智能技术国际会议&#xff08;ICCVIT 2024&#xff09;将于2024年1…

JAVA高级进阶11多线程

第十一天、多线程 线程安全问题 线程安全问题 多线程给我们带来了很大性能上的提升,但是也可能引发线程安全问题 线程安全问题指的是当个多线程同时操作同一个共享资源的时候,可能会出现的操作结果不符预期问题 线程同步方案 认识线程同步 线程同步 线程同步就是让多个线…

swiftui中几个常用的手势控制单击点击,双击和长按事件

简单做了一个示例代码&#xff0c;包含三个圆形形状&#xff0c;配置了不同的事件&#xff0c;示例代码&#xff1a; // // RouterView.swift // SwiftBook // // Created by song on 2024/7/4. //import SwiftUIstruct RouterView: View {State var isClick falsevar bod…

中实新材料:领航绿色建材新纪元,北京创新力量再攀高峰!

近期,北京中实新材料有限责任公司(以下简称“中实新材料”)以一系列耀眼的成果,彰显了其在绿色建材领域的卓越领导地位,不仅在生产效能、技术创新、市场拓展上取得了显著突破,更在社会责任与荣誉表彰上赢得了广泛赞誉。作为中关村科技发展(控股)股份有限公司旗下的璀璨明珠,中实…

Java - 程序员面试笔记记录 实现 - Part3

4.1 线程与进程 线程是程序执行的最小单元&#xff0c;一个进程可以拥有多个线程&#xff0c;各个线程之间共享程序的内存空间以及一些进程级资源&#xff0c;但拥有自己的栈空间。 4.3 Java 多线程 方法一&#xff1a;继承 Thread 类&#xff0c;重写 run 方法&#xff1b;…

实验五 数据库完整性约束的实现与验证

题目 在实验四的基础上&#xff0c;重新创建以下三个表&#xff1a; 会员表&#xff1a;member(memno,memname,address,telephone,username,userpwd)&#xff0c;主码为memno&#xff0c;属性memname不能取空值 员工表&#xff1a;employee(empno,empname,depno,sex,telephone…

【电源专题】DC-DC电路设计为什么一般只考虑电感DCR而不考虑Q值呢?

什么是电感器(线圈)的Q值&#xff1f; Q值是表示电感器质量的参数。Q是Quality Factor&#xff08;质量系数&#xff09;的简称。线圈会顺利流过直流电流&#xff0c;但会对交流电流产生电阻。这称为感抗&#xff0c;交流频率越高则越大。 此外&#xff0c;绕组虽是导体…

基于Istio的多网关运行时:配置、部署和应用

1. 引言 Istio是一个开源的服务网格&#xff0c;主要应用于简化微服务架构中的服务间通信、提供强大的监控能力以及加强服务的安全管理。通过利用Sidecar模式部署的Envoy代理&#xff0c;Istio能够在几乎无需修改服务代码的情况下&#xff0c;实现服务发现、负载均衡、加密通信…

C语言实战 | Flappy Bird游戏

Flappy Bird游戏是由一名越南游戏制作者独自开发的&#xff0c;曾经风靡全球。游戏规则非常简单&#xff0c;玩家必须控制一只小鸟&#xff0c;跨越由各种长度的水管所组成的障碍物&#xff0c;如果撞上管道游戏就结束&#xff0c;如图11.11所示。 ■ 图11.11Flappy Bird 游戏 …

go语言day08 泛型 自定义错误处理 go:协程

泛型&#xff1a; 抛错误异常 实现error接口类型 用java语言解释的话&#xff0c;实现类需要重写error类型的抽象方法Error().这样就可以自定义异常处理。 回到go语言&#xff0c;在Error()方法中用*argError 这样一个指针类来充当error接口的实现类。 在f2()方法中定义返回值…

IMU用于仿生水下机器人姿态估计

近期&#xff0c;自中国农业大学的研究团队从海豚身上汲取灵感&#xff0c;成功研发出一种创新性的双腱驱动机器人海豚尾鳍。这项创新性的设计不仅能够实现全方向运动&#xff0c;还能精细地模拟海豚的推力特性&#xff0c;揭示了其背后隐藏的力学秘密。 这款机器人尾鳍设计独特…

23432443

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

A股现在3000点已经是顶了吗?

今天的A股&#xff0c;让人咬牙切齿了&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市高开低走&#xff0c;近4900家股票回落&#xff0c;股民痛心疾首了。昨晚中概股都涨疯了&#xff0c;美股的科技股微软和…

【web APIs】快速上手Day03(Dom事件进阶)

目录 Web APIs - 第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑 注意事项-鼠标经过事件的区别两种注册事件的区别 事件委托综合案例-tab栏切换改造 其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚…

2024亚太杯中文赛数学建模选题建议及各题思路来啦!

大家好呀&#xff0c;2024年第十四届APMCM亚太地区大学生数学建模竞赛&#xff08;中文赛项&#xff09;开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次亚太杯推荐大家选择B题目。C题目难度较高&#xff0c;只建议用过kaiwu的队伍…

商务视频推广打造有吸引力的7个秘诀-华媒舍

商务视频推广是现代企业发展的重要工具&#xff0c;它能够帮助企业吸引更多的目标客户&#xff0c;提升品牌知名度&#xff0c;增加销售量。但是&#xff0c;如何打造一部有吸引力的商务视频推广呢&#xff1f;本文将为您介绍7个秘诀&#xff0c;帮助您在商务视频推广中取得成功…