函数
抽取封装 重复利用执行特定任务的公共代码块
function 带小括号()的都是函数
声明函数
function sayHi(){函数体}
function sayHi(){
console.log('你好世界');
}
sayHi()
函数名命名
小驼峰 前缀为动词 如can has is get set load say add getNames() addSquares()
调用函数
函数名() sayHi()
//函数封装九九乘法表
function getMultiplication(){
for(i=1;i<=9;i++){
for(j=1;j<=i;j++){
document.write(`${i}*${j}=${i*j} `)
}
document.write(`<br/>`)
}
}
getMultiplication()
函数传参
function 函数名(形参1,形参2){函数体}
调用函数 函数名(实参1,实参2)
开发中保持形参和实参个数一致 声明是形参 调用是实参
封装函数先找调用的函数
参数默认值 undefined 无实参则输出NaN
防止报错需给形参默认值 (形参1=0,形参2=0) 数组则 (形参=[])
//函数封装传参求1-50累加和
function getSums(start,end){
let sum = 0
for(i=start;i<=end;i++){
sum +=i
}
console.log(sum);
}
getSums(1,50);
//函数封装求累加和 实参为变量
function getSum(n=0,m=0){
let sum = 0
for(i=n;i<=m;i++){
sum+=i
}
console.log(sum);
}
let num1= +prompt('请输入起始数字')
let num2= +prompt('请输入终止数字')
getSum(num1,num2)
函数返回值
关键字return
return返回后立即结束函数, return的下一行代码不会被执行
//函数封装求两数最大值
function isMax(a,b){
return a>b?a:b
}
let num1 = prompt('请输入第1个数')
let num2 = prompt('请输入第2个数')
let max = isMax(num1,num2)
console.log(max);
//函数求数组的最大值与最小值 多个数据用数组
function getArrValue(arr=[]){
let max = arr[0]
let min = arr[0]
for(i=0;i<arr.length;i++){
if(max<arr[i]){
max = arr[i]
}
if(min>arr[i]){
min = arr[i]
}
}
return [max,min] //return返回多个数据 用数组的形式
}
let newArray = getArrValue([9,8,29,48,58,2948,657,3])
console.log(newArray);
console.log(`数组的最大值是:${newArray[0]}`)
console.log(`数组的最小值是:${newArray[1]}`)
作用域
代码可用性的范围
全局作用域:整个
<script>内部</script>外部引入的独立js文件全局变量:函数外声明的变量局部作用域:函数作用域/函数内部
局部变量:函数内声明的变量
全局变量和局部变量命名相同在不同的作用域下没有影响
作用域链中变量名相同执行时,先局部后全部, 采用就近原则,一层一层作用域查找
匿名函数
function(){}
具名函数 function fn(){}
函数表达式
将匿名函数赋值给变量,通过变量名称进行调用;使用场景web API中
//先声明
let fn = function(){}
//后调用
fn()
立即执行函数
不需要调用立即执行,防止变量名污染
多个立即执行函数用逗号隔开,具名函数也可用该方式调用
//两种写法
(function(){ })(),
function(){ }()),
逻辑中断
存在于逻辑运算符 && ||
&&左边为false则中断 (两边都为真输入最后的值)
||左边为true则中断 (两边都为真输出前面的值)
//没有实参程序不报错
function fn(x,y){
x=x || 0
y=y || 0
}
fn()
转换为boolean型
显式转换
'' 0 undefined null false NaN 转换后布尔型为false
'' 0 undefined null NaN打印输出时为原值
隐式转换
@1.undefined做任何+-操作结果是NaN NaN任意操作结果为NaN
@2.' '空字符串 + -操作时转换为0
@3.null数字操作时转换为0
函数案例--将秒数转换为时分秒
//函数封装转换秒数
let second = +prompt('请输入秒数')
function getTime(t){
let h = parseInt(t/60/60%24)
let m = parseInt(t/60%60)
let s = parseInt(t%60)
h=h<10?'0'+h:h
m=m<10?'0'+m:m
s=s<10?'0'+s:s
return `${h}时${m}分${s}秒`
}
let str = getTime(second)
document.write(str)
函数案例--交换两个数的值
function changeNum(x,y) {
//声明临时变量
let temp = x
x = y
y = temp
document.write(`第一个值的结果是${x} <br> 第二个值的结果是${y}`)
}
changeNum(3,4)
函数案例--判断数组求和或平均值
//flag形参默认为true
function handleData(arr,flag=true){
let sum = 0
for(i=0;i<arr.length;i++){
sum += arr[i]
}
if(flag){
//flag为真求数组和
return sum
}else{
//flag为假求平均值
return parseInt(sum /arr.length)
}
}
let a = handleData([48,29,49,30,45,2,45],false)
console.log(a);
函数案例--判断元素是否在数组中,存在输出true,不存在输出false
function some(ele,arr=[]){
//声明开关变量flag为false
let flag = false
for(i=0;i<arr.length;i++){
if(ele === arr[i]){
flag = true
break
}
}
return flag
}
console.log(some(0,[2,3,4,5,6,7])) //flase
函数案例 -- 判断元素是否存在,存在输出元素下标号,不存在输出-1
function findIndex(ele,arr=[]){
let index = -1
for(i=0;i<arr.length;i++){
if(ele === arr[i]){
index = i
break
}
}
return index
}
let a = findIndex(28,[98,85,38,9,5,28,2983])
console.log(a); //5