📌 函数基础与种类
> 函数定义方式
对代码块进行封装,方便反复使用
// 函数声明
function 函数名() {
...
执行代码块
}
// 匿名函数表达式-函数字面量
// 表达式定义方式 会自动忽略函数名 ——> 即匿名函数
var 函数名 = function() {
...
执行代码块
}
- 函数字面量(匿名函数表达式)定义函数可以是命名的,也可以是匿名的,函数名在作用域外是不可访问获取的
📌 形实参及映射
- 🔧 函数式编程:
一个固定的功能或程序段被封装的过程,实现一个固定的功能或程序,整个封装体中需要一个入口和一个出口。
入口就是函数的参数,出口就是返回值
函数的组成 多个实参、形参,参数间用逗号隔开
// 定义
function 函数名(形参1,形参2,形参3...) {
代码块
}
// 调用
函数名( 实参1,实参2,实参3.... )
- 形参:形式上占位,声明时的参数
- 实参:实际的数值,调用时的参数
- 形参与实参匹配,JS中可以不一致:
- 实参 == 形参 ——> 按顺序依次赋值
- 实参 > 形参 ——> 按顺序赋值,多余实参丢弃
- 实参 < 形参 ——> 按顺序赋值,未接收的形参默认undefined
arguments **函数内置对象** :
- 接收函数所有传入的实参,只能在函数中使用
- 伪数组:与数组相似,具有数组的特性,可通过索引取值
- 有长度(具有length属性,arguments.length)
- 包括了所有传入的实参,可以通过索引值获取元素
函数的返回值return 函数调用整体的值 == 函数的返回值 == return后面的数据
- 如果没有写return,函数内部会隐式添加return,值是undefined
- return可以中止函数运行,return后面的语句不会执行
📌 变量类型
作用域 提高程序可靠性,减少命名冲突
- 全局作用域:整个页面
- 局部作用域:函数只有在调用的时候可以在全局作用域中划分出局部作用域
变量类型
- 全局变量:全局作用域声明的变量,函数内部没有声明即赋值的变量
- 使用范围:全局作用域中任何位置都可以使用
- 局部变量:局部作用域中声明的变量
- 使用范围:当前局部作用域才可以使用
📋 课后作业
1.定义一个函数,接收用户输入的饮料名称,通过函数返回对应的价格? 2.定义一个函数,接收用户输入的运算符号(+、-、*、/、%)及数字,利用函数制作简易计算器,并返回结果? 3.定义一个函数,接收用户输入的数字N,不能使用for循环,计算出N的阶乘? 4.定义一个函数,接收用户输入的N,不能使用for循环,算出斐波那契数列第N位的数字
//定义一个函数,接收用户输入的饮料名称,通过函数返回对应的价格?-------------------------------------------------
var userDrink = window.prompt('请输入您要查询的饮料名称?')
priceInquiry(userDrink)
function priceInquiry(drink) {
switch (drink) {
case '可乐':
return document.write(drink + '价格是$2.00')
case '雪碧':
return document.write(drink + '价格是$3.00')
case '果粒橙':
return document.write(drink + '价格是$5.00')
case '雪花啤酒':
return document.write(drink + '价格是$2.00')
case '柠檬水':
return document.write(drink + '价格是$4.00')
case '苏打水':
return document.write(drink + '价格是$1.00')
case '健力宝':
return document.write(drink + '价格是$5.00')
default:
return document.write('您查询的饮料暂时没有!')
}
}
------------------------------------------------------------------------------------------------
//定义一个函数,接收用户输入的运算符号(+、-、*、/、%)及数字,利用函数制作简易计算器,并返回结果?
var userNum1 = parseFloat(window.prompt('请输入第一个数字?')),
operator = window.prompt('请输入运算符(+、-、*、/、%)?'),
userNum2 = parseFloat(window.prompt('请输入第二个数字?'));
compute(userNum1, operator, userNum2)
function compute(num1, operator, num2) {
switch (operator) {
case '+':
return document.write((num1 + num2).toFixed(2));
case '-':
return document.write((num1 - num2).toFixed(2));
case '*':
return document.write((num1 * num2).toFixed(2));
case '/':
return document.write((num1 / num2).toFixed(2));
case '%':
return document.write((num1 % num2).toFixed(2));
default:
return document.write((num1 + num2).toFixed(2));
}
}
------------------------------------------------------------------------------------------------
//定义一个函数,接收用户输入的数字N,不能使用for循环,计算出N的阶乘?
var userNum = parseInt(window.prompt('请输入需要计算阶乘的数字?'))
document.write(factorial(userNum))
function factorial(num) {
if (num <= 0) {
return 1
}
return num * factorial(num - 1)
}
--------------------------------------------------------------------------------------------------
//定义一个函数,接收用户输入的N,不能使用for循环,算出斐波那契数列第N位的数字
var userNum = parseInt(window.prompt('请输入要查询斐波那契数列第N位的数字?'))
document.write(fibonacci(userNum))
function fibonacci(num) {
if (num <= 2) {
return 1
}
return fibonacci(num - 1) + fibonacci(num - 2)
}