js函数与封装详细解答

一、到底什么是 JS 函数,为什么需要函数

通俗来讲,函数就是把一段完成特定任务的代码打包装起来,给它起个名字。以后想要执行这段逻辑,不需要重新抄写一遍代码,直接调用这个名字就可以运行。

没有函数的时候,同样的业务逻辑,我们要复制粘贴很多遍。一旦需求变动,每一处复制的地方都要修改。不仅写代码慢,还很容易产生 bug。

函数的价值:一次编写,随处调用。重复执行的逻辑交给函数处理。

JS 里面函数分为两大类:

内置函数:JS 语言原生自带,浏览器提供,直接调用,比如console.log()。不用我们自己写,开箱即用。

自定义函数:我们根据业务自己编写,也是学习的重点。

二、JS 函数几种定义方式,通俗易懂讲解

  1. 函数声明(最常用,新手优先用这个)

使用 function 关键字,起函数名字,括号写参数,大括号内部写函数体。

函数声明可以先调用,后定义,JS 会做提升处理。

结构拆解:

function 函数名 (参数 1, 参数 2){

// 函数体:真正要执行的代码

//return 返回结果

}

函数名:见名知意,动词开头,比如 getSum、checkPhone,不要用 a、b 这种无意义名字。

小括号参数:相当于函数的输入,外部传给函数的数据,可以没有参数,也可以多个。

大括号函数体:功能实现的全部代码。

return:把函数内部计算好的数据返回出去。如果不写 return,函数默认返回 undefined。

  1. 函数表达式

把函数赋值给一个变量。这种方式不能先调用后定义,不会变量提升。

js

运行

const 变量名 = function(){

}

  1. 箭头函数 ES6 新增

简写形式,适合回调、简短逻辑。箭头函数没有自己的 this,也不能做构造函数。

三、参数详解,新手最容易踩坑

参数分为形参和实参,很多同学分不清。

形参:写在函数定义小括号里面,相当于占位的变量。

实参:调用函数的时候,小括号传入真实的数据,传给形参。

  1. 无参函数

不需要外部传入数据,函数内部逻辑固定。调用的时候括号里面什么都不写。

  1. 有参函数

传入不同实参,函数就处理不同的数据,灵活性最高。

注意:如果定义写了 2 个形参,调用只传 1 个实参,那么第二个形参的值就是 undefined,很容易引发错误。

  1. 默认参数 ES6

定义形参的时候直接赋值默认值。调用不传这个参数,就自动使用默认值,防止 undefined 报错。

示例理解:定义函数接收姓名,年龄默认 20。调用只传姓名,年龄自动为 20;如果传入年龄,就覆盖默认值。

  1. 剩余参数 ...rest

当不确定会传入多少个参数的时候使用,会把所有传入参数收集成数组。

四、return 返回值重点,分清 console.log 和 return

这是新手头号误区!

console.log 仅仅是打印输出到控制台给人看,打印出来的数据,外部代码拿不到,不能参与后续运算。

return 才是把函数内部计算结果返回给外部。调用函数得到的结果,可以赋值变量、参与运算、传给别的函数。

执行 return 之后,函数会立刻终止,return 后面的代码不会再运行。

重要口诀:想看效果打印 log;想要拿到结果继续处理,一定要 return。

五、作用域,写函数绕不开的概念

作用域就是变量可以访问的范围。

全局作用域:函数外面定义的变量,整个 JS 文件任何地方都可以访问。全局变量不要随便创建,容易命名冲突,污染全局。

函数局部作用域:在函数内部用 let/const 声明的变量,只能在函数大括号内部使用。函数外面访问不到。函数执行完毕,局部变量就销毁释放内存。

坑点:函数内部不使用 let、const 直接赋值的变量会变成全局变量,非常不好,严禁这么写。

六、什么是 JS 代码封装?不要简单等同于写函数

很多人以为封装就是写函数,这句话不完全正确。

封装是编程思想:隐藏内部复杂实现细节,只暴露简单对外接口。

别人使用这个功能,只需要知道:调用哪个函数、需要传什么参数、会得到什么返回结果。不需要看懂函数内部一堆复杂循环判断。

函数是封装最小单元。后续对象、类、模块化,都是封装思想的延伸。

封装带来 4 个好处

代码复用:通用逻辑只写一次,多处调用,消除大量重复代码。

便于维护修改:逻辑只存在一处。修改需求、修复 bug,只修改函数内部,所有调用位置自动生效,不用到处改代码。

隔离作用域:局部变量不会污染全局命名空间,减少变量冲突。

可读性提升:一个函数只干一件事,看函数名就知道功能,不用通读一堆细节代码。

JS 函数封装黄金规范(实战必看)

单一职责原则:一个函数只做一件事情。不要把查询数据、DOM 渲染、弹窗提示全部塞到同一个函数。功能多就拆分成多个小函数互相调用。

命名规范:动词 + 名词,见名知意。比如 checkMobile 校验手机号,calcTotal 计算总价。拒绝 func1、aaa 这种命名。

尽量减少全局变量,多用函数内部局部变量。

通用计算逻辑优先 return 返回结果,函数内部少写 console.log。展示交给调用方处理。

参数不要过多,参数太多可以封装成对象传参。

函数内部做好简单容错,比如判断传入数据是否合法,避免异常报错。

相关推荐
南雨北斗2 小时前
Vue 3 项目中的拦截器的作用和写法(动态设置响应头适配表单文件上传)
前端
涛涛ing2 小时前
125秒到10秒:TypeScript 7.0用Go重写编译器,前端圈等了14年
前端
爱勇宝2 小时前
初创公司的“自己人”,到底能当多久?
前端·后端·程序员
晴天162 小时前
前端模块化规范全景解析:CommonJS、AMD、ESM、UMD
前端
三十而立洋3 小时前
深入理解 npm:从核心机制到常用命令全解析
前端·前端工程化
Canace3 小时前
最新版 Codex 工作流的问题
前端·人工智能·agent
AZaLEan__3 小时前
事件循环讲解
javascript
变与不变8063 小时前
引用类型、内存原理与对象
开发语言·前端·javascript
jearry3 小时前
给 C++ 老程序补现代 UI:WebView2 多入口资源加载与虚拟主机名实践
前端