函数
(1)函数是一个js的数据类型,叫做function
(2)是一个复杂数据类型(地址/引用)
(3)就是一个“盒子”,这个盒子可以承载一段代码
(4)涉及到两个过程:
函数定义阶段: 把代码装进盒子的过程
函数调用阶段: 把盒子内的代码执行的过程
一、函数定义阶段
把一个代码装进“盒子”的过程,在这过程中,被装进去的代码是不会被执行的
1、方式1:声明式函数
(1)语法:function 函数名() {你要装进盒子的代码}
fanction-------定义函数的关键字
函数名-------给盒子起的名字,遵守变量命名规则和规范
()-------- 书写参数的位置
{} ----------- 代码段,你要装进盒子里的代码
function fn() {
console.log("hello world")
}
2、方式2:赋值式函数(函数表达式),就是把函数当做一个表达式赋值给另外的内容
(1)语法:var fn = function () {}
var fn2=function() {
console.log("hello world")
}
二、函数调用阶段
1、两种定义函数的方式, 他们的 调用方式 是一样的
语法: 函数名()
-
函数名 :表示你需要哪一个函数内的代码执行
-
() : 把函数内的代码执行一遍, 意义2: 书写参数
2、两种定义函数的方式, 他们的 调用时机 是不一样的
(1)声明式函数可以先调用也可以后调用
(2)赋值式函数(函数表达式) 只能后调用, 先调用会报错
三、函数的参数
1.形参
(1)书写在函数定义阶段的()内
(2)只能在函数内部使用
(3)可以书写多个,之间用逗号分隔
(4)形参的值由函数调用时传递的实参决定
2.实参
(1)书写在函数调用阶段的()内
(2)就是按照数据依次给形参赋值的数据
(3)可以书写多个,之间用逗号分隔
3.函数的参数默认值
(1)给函数的形参添加一个默认值
(2)当没有传递实参的时候,可以使用默认值
(3)可以书写多个,之间用逗号分隔
(4)语法:直接给形参赋值即可
function fn(a = 100, b = 200) {
console.log('a : ', a)
console.log('b : ', b)
}
// 本次调用没有传递实参, a 和 b 形参都使用默认值
fn()
// 本次调用传递了一个实参给到 a, 那么 a 就是被赋值为 1, b 依旧是用默认值
fn(1)
// 本次调用传递了两个实参分别给到 a 和 b 了
fn(10, 20)
arguments
(1)是一个在函数内使用的变量
(2)是函数天生自带的变量
(3)是一个数据集合(承载数据的盒子)
承载的就是该函数被调用的时候传递的所有 实参
函数实参的集合
-
arguments的基本操作
1.length属性
(1)语法表示:arguments.length
(2)表示:该数据集合内有多少个数据 也就是多少个实参
(3)得到:一个数据类型(Number)
2.索引属性
(1)arguments 内的数据是按照顺序依次排列的
(2)arguments 内的每一个数据都有一个自己的 “序号”(索引/下标)
(3)索引(下标): 从 0 开始, 依次 +1
(4)可以利用索引去访问 arguments 内的每一个数据
(5)语法: arguments[索引]
得到的就是该索引位置对应的数据
如果没有该索引位置, 那么就是 undefined
(6)最后一位的索引一定是 arguments.length-1
3.遍历 arguments
(1)从到到位获取到每一个数据
(2) arguments 内可以利用索引去访问每一个数据
(3)arguments 内的索引是一组有规律的数字(从 0 开始, 依次 +1)
(4) 循环可以给我们提供一组有规律的数字
(5)可以利用 循环 去遍历 arguments
使用循环控制变量去充当索引访问 arguments 内的每一个数据
function fn3() {
// 准备变量接受求和结果
var sum = 0
// 遍历 arguments
for (var i = 0; i < arguments.length; i++) {
sum += arguments[i] // 把 arguments 内的每一个数据叠加到 sum 身上
}
console.log(sum) /*把 sum 输出*/
}
函数的return
作用:
1、给函数添加一个返回值
在函数内以 return 关键字确定该函数的结果 return 数据
2、打断函数:书写在return后的代码不会继续执行
fn 与fn()
(1)fn是一个变量名,存储的是该函数的“地址”,书写这句代码的时候,不会执行函数内的代码
(2)fn() 表示把 fn 这个函数内的代码从上到下的执行一遍, 并且会根据 return 来决定是否得到返回值
/*封装函数判断一个数字是否是质数*/
function isPrime(n) {
if (isNaN(n)) return false
n = Number(n)
for (var i = 2; i <= n / 2; i++) {
if (n % i === 0) break
}
return i > n / 2
}
----------------------------------------------
/*封装一个函数,求一个数字的阶乘*/
function fn(n) {
// n 就是要求阶乘的数字
// 1. 判断是不是一个数字
if (isNaN(n)) return 0
// 2. 把参数转换成数值类型
n = n - 0
// 3. 求 n 的阶乘
var total = 1
for (var i = n; i >= 2; i--) {
total *= i
}
// 4. 把 total 当做返回值
return total
}
console.log(fn(8))
自调用函数
1.函数表达式的一种特殊使用方式
2.不严格区分函数的定义阶段和调用阶段,直接定义函数, 定义完毕以后直接调用, 并且不能进行二次调用
3.语法:
(1) (function () {})()
(2)~function () {}()
(3)!function () {}()