函数(下)
6.函数形参默认值
格式:
function getSum(a = 默认值,b = 默认值){}
注意点:
在ES6之前可以通过逻辑运算符来给形参指定默认值;
在逻辑或运算中,如果参与运算的不是布尔类型,返回值有一个特点
格式:条件A || 条件B
如果条件A成立,那么就返回条件A;
如果条件A不成立,无论条件B成不成立,都会返回条件B.
function getSum(a,b){
//在ES6之前可以通过逻辑运算符来给形参指定默认值
//在逻辑或运算中,如果参与运算的不是布尔类型,返回值有一个特点
//格式:条件A || 条件B
//如果条件A成立,那么就返回条件A;
//如果条件A不成立,无论条件B成不成立,都会返回条件B.
a = a || "omg";
b = b || "OMG";
consloe.log(a,b);
}
getSum();
//从ES6开始,可以直接在形参后面通过 = 指定默认值
//还可以从其它函数中获取
function getSum(a = "omg",b = getDefault()){
console.log(a,b);
}
getSum(123,"abc");
//getSum();
function getDefault(){
return "xxx";
}
7.函数作为参数和返回值
- 由于JavaScript中的函数也是一种数据类型, 所以函数也可以作为参数和返回值使用
- 函数作为其他函数参数
- 函数作为其他函数返回值
8.匿名函数
什么是匿名函数?
匿名函数就是没有名称的函数.
注意点:
不可以只定义不使用.
应用场景:
- 作为其他函数的参数;
- 作为其他参数的返回值;
- 作为一个立即执行的函数.
//有名称的函数
/*
function say(){
console.log("hello world");
}
let say = function(){
console.log("hello world");
}
*/
//没有名字的函数
function(){
console.log("hello world");
}
//作为其他函数的参数
function test(fn) {//let fn = say;
fn();
}
test(function () {
console.log("hello world");
});
//作为其他参数的返回值
function test() {
return function () {
console.log("hello world");
}
}
let res = test();
res();
//作为一个立即执行的函数
//注意点:如果想让匿名函数立即执行,那么必须使用圆括号将函数的定义包裹起来才可以
(function () {
console.log("hello world");
})();
9.箭头函数
- 什么是箭头函数? 箭头函数是ES6中新增的一种定义函数的格式,目的是为了简化定义函数的代码.
let arr = new Array();
let arr = []; - 在ES6之前如何定义函数?
function 函数名称(形参列表){
需要封装的代码;
}
let 函数名称 = function(形参列表){
需要封装的代码;
} - ES6开始如何定义函数?
let 函数名称 = (形参列表) =>{
需要封装的代码;
} - 注意点
在箭头函数中如果只有一个形参,那么()可以省略;
在箭头函数中如果{}中只有一句代码,那么{}也可以省略
/*function say(){
console.log("hello world");
}
say();*/
/*let say = () =>{
console.log("hello world");
}
say();*/
/*function say(name){
console.log("hello" + name);
}
say("wyy");*/
let say = name =>console.log("hello" + name);
say("wyy");
10.递归函数
什么是递归函数?
递归函数就是在函数中自己调用自己,我们就称之为递归函数;
递归函数在一定程度上可以实现循环的功能;
function login(){
//1.接收用户输入的密码
let pwd = prompt("请输入密码");
//2.判断密码是否正确
if(pwd !== "123456");{
login();
}
//3.输出欢迎回来
alert("欢迎回来");
}
回溯
注意点:
在实际使用中,登录函数不建议使用递归来写,如果一直输入错误,就会开辟很多的内存空间.
11.函数中变量作用域
- 在JavaScript中{}外面的作用域,我们称之为
全局作用域
; - 在JavaScript中
函数后面{}
中的作用域,我们称之为局部作用域
; - 在ES6中只要{}没有和函数结合在一起,那么就是
块级作用域
; - 块级作用域和局部作用域的区别:
1.在块级作用域中通过var定义的变量是全局变量;
2.在局部作用域中通过var定义的变量是局部变量; - 无论是在块级作用域中还是局部作用域,省略变量前面的let或者var就会变成一个全局变量.
{
//块级作用域
}
if(false){
//块级作用域
}
while(false){
//块级作用域
}
for(::){
//块级作用域
}
do{
//块级作用域
}while(false);
switch(){
//块级作用域
}
function say(){
//局部作用域
}