js:函数
函数
函数:实现抽取+封装,执行特定任务的代码块,方便复用
声明
函数命名规范
尽量小驼峰
前缀应该为动词,如getName、hasName
函数的调用
函数体是函数的构成部分
函数传参
参数列表里的参数叫形参,实际上写的数据叫实参
形参可以看作变量,如果变量不给值,默认为未定义(undefined)
例如一个两数求和的函数,如果用户在使用的时候不传入实参,两个未定义(undefined+undefined)的结果是什么?
NaN
为了防止出现异常的NaN,我们可以在用户不输入参数的时候提供默认参数(形参默认值),可以默认为0
形参默认值写在函数里形参声明的地方
function getArrSum(arr=[]) {
//保证程序不报错
let sum=0
for (let i = 0; i < arr.length;i++){
sum+=arr[i]
}
console.log(sum);
}
let arr=[]
for(let i=0;i<10;i++){
arr[i]=+prompt('请输入数字:')
}
getArrSum(arr)
除了这种写法还有
逻辑中断
猜猜这段代码的打印结果?
let age=18
console.log(false&&age++)
console.log(age)
答案是false和18,age没有变;因为&&左边为false,所以不执行右边的表达式
关于Boolean的转换
‘’ 、0、undefined、null、false、NaN 转换为布尔值后都是false, 其余则为 true
一些其他隐式转换:' '+1='1'' '-2='-2'null经过数字转换为0,null+3=0+3=3undefined经过数字转换为NaN(除了字符串拼接其余都为NaN),undefined+3=NaN
let n = undefined
console.log(n + 'sss');
函数返回值
把函数处理完的结果返回给调用者
用return关键字
函数体内使用return关键字能返回函数体执行的结果交给外部使用
return后面的代码不执行
return函数没有return的时候,函数默认返回undefined
返回多个数据
function getArr(arr = []) {
for (let i = 0; i < 5; i++) {
arr[i] = +prompt('请输入数字:')
}
}
function getMax(arr = []) {
let min = arr[0]
let max = arr[0]
for (let i = 0; i < 5; i++) {
if (arr[i] > max) max = arr[i]
if (arr[i] < min) min = arr[i]
}
return [max, min]//新数组
}
let arr = []
getArr(arr)
console.log(arr)
console.log(getMax(arr))
断点调试进入函数内部f11(步入),不进入函数内部f10(步过)
js没有函数重载,只要函数名一样,写在后面的函数会覆盖前面的函数
js里传递的实参个数可以少于形参的个数,会自动填为undefined;如果实参多余形参,多余的实参会被忽略
break结束循环和switch,return结束函数
作用域
限定数据的可用性代码范围就叫作用域,作用域提高了程序逻辑的局部性、增强了可靠性、减少了名字冲突
相应的,变量有局部变量和全局变量之分
如果函数内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐
但是有一种情况,函数内部的形参可以看做是局部变量
变量访问原则
只要是代码,就至少有一个作用域
写在函数内部的局部作用域
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
在能访问的情况下,先局部,局部没有再全局
采取就近原则查找变量的最终值
匿名函数
第一种写法
函数表达式:将匿名函数赋值给一个变量,并且通过变量名进行调用
和go像
具名函数(有名字的函数)的调用可以放在任何位置
函数表达式必须先声明再调用
后面学api会用
第二种写法
立即执行函数
括号的位置不同,在声明的时候执行
多个立即执行的时候一定要在后面加分号(分号也可以写前面)
好处是防止变量污染
函数调用练习
let num = prompt('用户输入秒数')
function getTime(t) {
let day = parseInt(t / 3600 / 24)
let h = parseInt(t / 3600 % 24)
let m = parseInt(t / 60 % 60)
let s = parseInt(t % 60)
day < 10 ? '0' + day : day
h = h < 10 ? '0' + h : h
m = m < 10 ? '0' + m : m
s = s < 10 ? '0' + s : s
return `${t}转换为${day}天${h}小时${m}分钟${s}秒`
}
let str = getTime(num)
document.write(str)
函数里不声明直接赋值外部可以访问,会有风险