目录
[1. 声明函数](#1. 声明函数)
[2. 调用函数](#2. 调用函数)
[3. 一个更实际的例子](#3. 一个更实际的例子)
[关于 return,有几个关键点:](#关于 return,有几个关键点:)
[1. 全局作用域](#1. 全局作用域)
[2. 局部作用域(函数作用域)](#2. 局部作用域(函数作用域))
[3. 查找规则](#3. 查找规则)
[⚠️ 一个坑(不推荐写法)](#⚠️ 一个坑(不推荐写法))
[1. 函数表达式](#1. 函数表达式)
[2. 立即执行函数(IIFE)](#2. 立即执行函数(IIFE))
[1. 函数](#1. 函数)
[2. 参数 & 返回值](#2. 参数 & 返回值)
[3. 作用域](#3. 作用域)
[4. 匿名函数](#4. 匿名函数)
一、函数到底解决了什么问题?
写代码时很容易遇到一种情况:
console.log('嗨~')
console.log('嗨~')
console.log('嗨~')
如果某段逻辑需要重复使用,一直复制粘贴显然不是办法。
👉 这时候就需要函数。
函数的本质可以理解为:
把一段逻辑"封装"起来,需要的时候再调用
二、函数的基本用法
1. 声明函数
function sayHi() {
console.log('嗨~')
}
2. 调用函数
sayHi()
👉 注意:函数声明之后不会自动执行,必须调用才会运行。
3. 一个更实际的例子
function printStar() {
document.write('*<br>')
document.write('**<br>')
document.write('***<br>')
}
printStar()
printStar()
如果不用函数,这段代码会非常冗余。
三、参数:让函数变得灵活
如果函数只能写死逻辑,那价值其实有限。
比如打招呼:
function sayHi(name) {
console.log('嗨~' + name)
}
sayHi('小明')
sayHi('小红')
👉 关键点:
name是形参(形式参数)'小明'是实参(实际参数)
可以理解为:
形参 = 函数内部的变量
实参 = 给变量赋的值
参数使用建议
- 参数顺序要一致
- 尽量保证"传几个参数,定义几个参数"
四、返回值:函数的输出
函数不仅可以执行逻辑,还可以"返回结果"。
function sum(a, b) {
return a + b
}
let result = sum(5, 10)
关于 return,有几个关键点:
return用于返回结果- 一旦执行
return,函数立即结束 - 一个函数通常只写一个
return - 没写
return→ 默认返回undefined
五、作用域:变量到底能在哪里用?
可以简单理解为:
变量在哪个范围内有效
1. 全局作用域
let num = 10
- 在整个文件中都可以使用
- 生命周期比较长
2. 局部作用域(函数作用域)
function test() {
let num = 20
}
- 只能在函数内部使用
- 外部访问不到
3. 查找规则
👉 变量查找遵循:
先找局部 → 再找全局
例如:
let num = 10
function test() {
let num = 20
console.log(num)
}
test() // 输出 20
⚠️ 一个坑(不推荐写法)
function test() {
num = 100
}
👉 这会变成全局变量,非常危险,实际开发中一定要避免。
六、匿名函数
除了普通函数,还有一种更灵活的写法。
1. 函数表达式
let fn = function() {
console.log('函数表达式')
}
fn()
👉 特点:
- 没有函数名
- 通过变量调用
2. 立即执行函数(IIFE)
(function() {
console.log('立即执行')
})()
或者:
(function() {
console.log('立即执行')
}())
👉 特点:
- 定义完立刻执行
- 不需要手动调用
- 常用于隔离作用域(避免变量污染)
七、核心总结
1. 函数
- 用来封装代码,提高复用性
- 写完必须调用才执行
2. 参数 & 返回值
- 参数 → 输入
- return → 输出
👉 函数 = 输入 → 处理 → 输出
3. 作用域
- 局部优先
- 避免污染全局变量
4. 匿名函数
- 更灵活的写法
- 在实际开发(回调、事件)中大量使用