1.函数的作用
函数是将具体的操作封装成代码块,当下次用到这个操作的时候就可以直接使用这个函数,为了代码的复用性,使代码更加精简,便于修改需求和项目维护
2.函数的创建及调用
function 函数名(形参) {
函数体:这个函数的具体功能
return 返回值 // 调用函数得到的值(注:可以没有返回值,遇到return就退出函数,想返回多个值用数组)
}
// 函数的调用
函数名(实参)
- 实参的值会赋值给形参,两者的个数可以不匹配
- 如果实参的个数小于形参的个数,未被赋值的变量值为undefined
- 如果实参的个数大于形参的个数,多于的实参值会被舍弃
3.函数的类型
console.log(typeof function getSum() {}) // ‘function’
4.变量的作用域
全局作用域:函数以外的作用域,有且只有一个全局作用域
局部作用域:函数以内的作用域,可以有多个函数作用域
全局变量:在全局作用域下声明的变量,可以在任意作用域下使用
局部变量:在局部作用域下声明的变量,只能在局部作用域下使用
JS的预加载/预解析:
在程序执行之前,会将var声明的变量提升在所在作用域的最前面。只提升声明部分,不提升赋值部分
变量的查找规则:就近原则
形参属于局部变量,只能在所属函数中使用
5.函数的作用域
全局函数:在全局作用域下创建的函数,可以在任意作用域下调用
局部函数:在函数作用域下创建的函数,只能在所处作用域下调用
函数提升:在程序执行前,会将函数的全部提升到所在作用域的最前面
6.匿名函数
没有名字的函数。在使用时,可以当做变量的值、当做参数值、可以自调用;ES6中的匿名函数等同ES5,但在ES6中,匿名函数包含了箭头函数。
//将匿名函数当做变量的值:
let show = function(a,b) {
console.log(a,b) //10,20
}
show(10,20)
//将匿名函数当做参数值:
function show5(k){
//回调函数
k();
}
show5(function(){
//调用了匿名函数
console.log('a');//a
})
//匿名函数自调用:(还有解决全局污染的作用)
;(function(){
console.log('b'); //b
})()
7.箭头函数
(1)写法:
去掉函数名,去掉function,在() 与 {}之间加上=>
//将匿名函数当做变量的值:
let show = (a,b) => {
console.log(a,b) //10,20
}
show(10,20)
test(10, 20, (z) => {
console.log(z)
})
//匿名函数自调用:(还有解决全局污染的作用)
;(() => {
console.log('b') //b
})()
(2)箭头函数的变形
当箭头函数函数体只有一条语句时,包裹函数的{}可以去掉;
当箭头函数体中只有一条返回语句时,可以省去{},并省去return;
当有仅只有1个形参时,包裹形参的()可省。
// 当箭头函数函数体只有一条语句时,可以省略{}
let show1 = () => console.log('a')
show1()
// 当箭头函数只有一条返回语句时,可以去掉{}和return
let show2 = () => 100
console.log(show2()) // 100
// 当带参数的箭头函数只有一条返回语句时,可以去掉{}和return
let show3 = (m,n) => m + n
console.log(show3(10, 100)) // 110
// 当箭头函数有且仅有一个形参时,包围形参的()可以省略
let show4 = key => key + 1
console.log(show4(200)) // 201
(3)箭头函数中的this
待续。。。
8.回调函数
就是把一个函数类型的值作为参数传递给另一个函数,被传递的这个函数就叫做回调函数。
function xin (madai){
madai()//调用传进来的函数
}
function ming (){
console.log('普通函数')
}
xin (ming) //传递的是普通函数的名字
xin (function(){ }) //传递的是匿名函数的整体
9.递归
函数自己调自己。本身是个死循环,切记设置边界条件及时退出
要点:总结规律+边界条件
// 计算5!
function f(num) {
if (num==1) {
return 1
} else {
return f(num-1)*num
}
}
console.log(f(5)) // 120
关于作用域的面试题
let a, b = 0, fn = function() {
let a = b = 2;
};
fn();
console.log(a, b)
// undefined, 2
/*
a:先声明了a但未赋值,fn中定义的a只作用于fn内部,输出值输出外部的a,故a仍然是undefined
b:先声明了b并给b赋值为0,fn中又将2赋值给b,并未再声明一个b,所以作用的是fn外部的b,故改变了b的值
*/