JavaScript基础-函数(完整版)

文章目录

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

函数

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

基本使用

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

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

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

函数提升

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

函数参数

  • 形参:声明函数时小括号里的叫形参
  • 实参:调用函数时小括号里的叫实参
  • 执行过程:把实参的数据传递给形参,提供给函数内部使用。
    在这里插入图片描述
function getSum(x,y) {console.log(x,y) //3 5return 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,而不是NaNx = x || 0y = y || 0console.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 = 123function f2 () {console.log(num)    //123}f2()
}
let num = 234
f1()// 练习2. 
let a = 1
function fn1() {let a = 2let b = '22'fn2()function fn2() {let a = 3fn3()function fn3() {let a = 4console.log(a)  //4console.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 = 0function 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 = truesetTimeout(() => {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: ageuname,age,// 方法简写sing() {console.log('hahahaha')}}console.log(obj)obj.sing()</script>
    </body>
    

断点调试-进入函数内部

在这里插入图片描述

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

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

    在这里插入图片描述

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

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

相关文章

1.21作业

1 unserialize3 当序列化字符串中属性个数大于实际属性个数时&#xff0c;不会执行反序列化 外部如果是unserialize&#xff08;&#xff09;会调用wakeup&#xff08;&#xff09;方法&#xff0c;输出“bad request”——构造url绕过wakeup 类型&#xff1a;public class&…

LLaMA-Factory|微调大语言模型初探索(3),qlora微调deepseek记录

前言 上篇文章记录了使用lora微调llama-1b,微调成功,但是微调llama-8b显存爆炸,这次尝试使用qlora来尝试微调参数体量更大的大语言模型,看看64G显存的极限在哪里。 1.Why QLora? QLoRA 在模型加载阶段通过 4-bit 量化大幅减少了模型权重的显存占用。QLoRA 通过 反量化到 …

TCP传输可靠性保障:理论讲解→实战面试解析

一、TCP为何需要可靠性保障&#xff1f; TCP作为互联网的"运输队长"&#xff0c;承担着80%以上的网络数据传输任务。其核心使命是&#xff1a;在不可靠的IP层之上&#xff0c;构建端到端的可靠传输通道。 想象一下网购时商品运输需要防丢包、防损坏、防错序&#xff…

一篇搞懂vue3中如何使用ref、reactive实现响应式数据

ref 可实现 基本类型、对象类型响应式数据 reactive&#xff1a;只能实现 对象类型响应式 ref实现 基本类型 数据响应式&#xff1a; <template><div class"person"><h2>姓名&#xff1a;{{ name }}</h2><h2>年龄&#xff1a;{{ ag…

Linux 内核自旋锁spinlock(四)--- queued spinlock

文章目录 前言一、queued spinlock1.1 简介1.2. spin_lock/spin_unlock 二、源码解析2.1 struct qspinlock2.2 struct qnode2.3 queued_spin_lock2.3.1 快速申请通道CPU0申请锁 2.3.2 慢速申请通道CPU0/1申请锁CPU0/1/2申请锁CPU0/1/2/3申请锁 queued_spin_lock_slowpath总结 2…

一种最常见的js加密解密

前言 在前端开发的广袤天地中&#xff0c;你是否遭遇过一些看似“乱码”般的代码&#xff0c;根本无从下手理解&#xff1f;这其实很可能是被 _0x处理过的代码。_0x就像一位神秘的“化妆师”&#xff0c;能把原本清晰的代码改头换面。今天&#xff0c;我就来分享如何破解这些被…

git使用-克隆远程项目、分支管理

文章目录 克隆远程项目到本地1. 远程找到需要克隆的项目&#xff0c;复制ssh地址2. idea开启git版本控制&#xff08;如果已经开了&#xff0c;忽略此步骤&#xff09;3. clone远端项目4. 克隆完成 分支管理1. 新建分支2. 切换分支3. 合并分支4. 储存变化 克隆远程项目到本地 …

Python实战:Excel中文转拼音工具开发教程

在日常办公中&#xff0c;我们经常需要处理Excel文件&#xff0c;有时候需要将中文转换为拼音缩写以方便检索和使用。今天我将分享一个使用Python开发的小工具&#xff0c;它可以自动将Excel文件中指定列的中文转换为拼音缩写。 C:\pythoncode\new\ConvertExcelcontentToPinyin…

什么是矩阵账号?如何高效运营tiktok矩阵账号

‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌​‌‌​‌‌‌‍‌​‌​‌​​​‍‌​​‌​‌‌​‍‌​​​​‌‌​‍‌​‌​​‌‌‌‍‌​​‌‌​‌​‍‌​‌​​‌‌‌‍‌​‌‌‌​​‌‍‌‌​​‌‌‌​‍‌‌​​‌‌​​‍‌…

Docker-技术架构演进之路

目录 一、概述 常见概念 二、架构演进 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 三、尾声 一、概述 在进行技术学习过程中&am…

并查集算法篇上期:并查集原理及实现

引入 那么我们在介绍我们并查集的原理之前&#xff0c;我们先来看一下并查集所应用的一个场景&#xff1a;那么现在我们有一个长度为n的数组&#xff0c;他们分别属于不同的集合&#xff0c;那么现在我们要查询数组当中某个元素和其他元素是否处于同一集合当中&#xff0c;或者…

MacOS 15.3 卸载系统内置软件

1、关闭系统完整性&#xff08;SIP&#xff09; 进入恢复模式(recovery) 如果您使用的是黑苹果或者白苹果&#xff0c;可以选择 重启按住CommandR 进入&#xff0c;如果是M系列芯片&#xff0c;长按开机键&#xff0c;进入硬盘选择界面进入。 我是MacMini M4芯片&#xff0c;关…

内容中台重构企业内容管理的价值维度与实施路径

内容概要 在数字化转型进程中&#xff0c;企业内容管理&#xff08;ECM&#xff09;与内容中台的差异性体现在价值维度的重构与能力边界的突破。传统ECM系统通常聚焦于文档存储、权限控制等基础功能&#xff0c;而内容中台通过标准化流程引擎与智能工具链&#xff0c;构建起覆…

挖矿病毒实战分析

场景说明 运维人员再设备巡检过程中发现CPU莫名到达百分百&#xff0c;出现异常&#xff0c;请开始你的应急响应排查 cpu百分百&#xff0c;基本就可以确定是中了挖矿病毒了 我们使用命令ps -aux查看进程&#xff0c;或者使用top -c查看进程&#xff0c;排查挖矿程序 使用t…

蓝桥杯好数

样例输入&#xff1a; 24 输出&#xff1a;7 输入&#xff1a;2024 输出&#xff1a; 150 思路&#xff1a;本题朴素方法的时间复杂度是O(n * log10(n)) &#xff0c;不超时。主要考察能否逐位取数&#xff0c;注意细节pi&#xff0c;这样不会改变i,否则会导致循环错误。 #in…

cs*n 网页内容转为html 加入 onenote

csdn上有好用的内容&#xff0c;我们怎么将它们加到 onenote 里吃灰呢。 一、创建 新html create_html.py import sysdef create_html_file(filename):# 检查是否提供了文件名if not filename:print("请提供HTML文件名")return# 创建HTML内容html_content f"…

【后端基础】布隆过滤器原理

文章目录 一、Bloom Filter&#xff08;布隆过滤器&#xff09;概述1. Bloom Filter 的特点2. Bloom Filter 的工作原理 二、示例1. 添加与查询2. 假阳性 三、Bloom Filter 的操作1、假阳性概率2、空间效率3、哈希函数的选择 四、应用 Bloom Filter 是一种非常高效的概率型数据…

【SPIE出版,见刊快速,EI检索稳定,浙江水利水电学院主办】2025年物理学与量子计算国际学术会议(ICPQC 2025)

2025年物理学与量子计算国际学术会议&#xff08;ICPQC 2025&#xff09;将于2025年4月18-20日在中国杭州举行。本次会议旨在汇聚全球的研究人员、学者和业界专家&#xff0c;共同探讨物理学与量子计算领域的最新进展与前沿挑战。随着量子技术的快速发展&#xff0c;其在信息处…

数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)

数据库驱动找起来好麻烦&#xff0c;我整理到了一起&#xff0c;需要的朋友免费下载&#xff1a;驱动下载 目前收录了Oracle、Mysql、达梦、Postgresql的数据库驱动的多个版本&#xff0c;后续可能会分享更多。

【2025最新版】Chrome谷歌浏览器如何能恢复到之前的旧版本

背景 今天程序突然出了bug&#xff0c;无法自动测试了&#xff0c;显示Chrome版本不匹配&#xff0c;一看&#xff0c;Chrome居然在我已经关闭升级的情况下&#xff0c;又给我升级了&#xff0c;然后就悲剧了&#xff0c;我的代码不能用了。 于是&#xff0c;做了以下几步&…