系列文章目录
上一期我们学习了数值扩展的相关内容,这一期我们讲解函数的扩展相关知识。
函数的扩展
- 函数参数的默认值
- 箭头函数
- 箭头函数中this的理解
- 箭头函数使⽤注意点
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
1、函数参数的默认值
- ES6之前,不能直接为函数的参数指定默认值,只能采⽤变通的⽅法。
- ES6允许为函数的参数设置默认值,即直接写在参数定义的后⾯。
- 参数默认值的位置:
1 通常情况下,定义了默认值的参数,应该是函数的尾参数。
2因为这样⽐较容易看出来,到底省略了哪些参数。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f(name) {
console.log(name);
}
f("xiaoqiao");//xiaoqiao
</script>
</body>
</html>
当我们的函数的参数在传参的时候赋值了,则会按照传进来的参数进行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f(name) {
console.log(name);
}
f();//undefined
</script>
</body>
</html>
如果函数的参数未传,会默认赋值为undefined
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f(name) {
name=name||"lisi";
console.log(name);//lisi
}
f();//undefined
</script>
</body>
</html>
在我们对函数进行传参的时候,我们可以对函数的参数进行默认值的设置,当我们未对函数的参数设置的时候,我们的参数就会使用我们设置的初始值。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f(name="lisi") {
console.log(name);//lisi
}
f();//undefined
</script>
</body>
</html>
这是我们的另一种写法,我们还可以在参数列表的时候就对参数进行赋值,作用和上面的那种一样。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f(x,y) {
console.log(x+y);
}
f(10,20);//30
</script>
</body>
</html>
当我们的函数有多个参数的时候,我们赋值的时候就需要注意了,当我们参数的默认值都设置的时候
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f(x,y) {
x=x||10;
y=y||20;
console.log(x+y);
}
f();//30
f(10,20);//30
f(10);//30
</script>
</body>
</html>
当我们没对所有的参数进行默认值设置的时候,我们的参数设置时,就是从前面往后面进行设置,所以当我们的参数没有设置的时候
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f(x=10,y) {
console.log(x+y);
}
f(10,20);//30
f(10);//NaN
f();//NaN
</script>
</body>
</html>
2、箭头函数
- ES6允许使⽤“箭头”(=>)定义函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f(x) {
return x;
}
console.log(f(100));//100
var x=(x)=> {
return x;
}
console.log(x(100));//100
var x1=x=> {
return x;
}
console.log(x1(100));//100
var x2=x=>x
console.log(x2(100));//100
</script>
</body>
</html>
当我们对函数定义时,我们可以使用箭头函数来更方便的去定义函数,当函数的参数只有一个的时候小括号可以省略,当我们的函数体只有一行语句时花括号也能省略。
如果箭头函数不需要参数或需要多个参数,就使⽤⼀个圆括号代表参数部分。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f() {
return 100;
}
console.log(f(100))//100
var x=()=>100;
console.log(x());
</script>
</body>
</html>
当我们定义的函数没参数的时候,可以这样定义
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function f(x,y) {
return x+y;
}
console.log(f(100,200))//300
var x=(x,y)=>x+y;
console.log(x(100,200));//300
</script>
</body>
</html>
当我们函数的参数有多个时,例如上述的代码所示
- 如果箭头函数的代码块部分多于⼀条语句,就要使⽤⼤括号将它们括起来,并且使⽤return语句返 回。
- 也就是说默认函数体没有⼤括号是⾃带隐式返回renturn的。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
var x=(x,y)=> {
let sum=x+y;
return sum;
};
console.log(x(100,200));//300
</script>
</body>
</html>
- 由于⼤括号被解释为代码块,所以如果箭头函数直接返回⼀个对象,必须在对象外⾯加上括号,否 则会报错。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
var x=(x,y)=> {
let sum=x+y;
let person={x:x,y:y,sum:sum};
return person;
};
console.log(x(100,200));//300
let getTempItem = id => ({ id: id, name:"Temp" });
console.log(getTempItem(15))
</script>
</body>
</html>
3、箭头函数中this的理解
传统javaScript代码中this的使⽤
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//定义⼀个stu学⽣对象,内有:两个属性、⼀个⽅法。
const stu = {
name:"张三",
likes:['吃饭','睡觉','敲代码'],
printLikes:function(){
//使⽤map遍历likes属性,并输出信息
this.likes.map(function(like){
//此处的this代表的是window对象,⽽⾮stu对象
console.log(`${this.name} 喜欢 ${like}`);
});
}
};
stu.printLikes(); //使⽤stu对象调⽤⾃⼰的⽅法
/* 输出结果:
喜欢 吃饭
喜欢 睡觉
喜欢 敲代码
*/
</script>
</body>
</html>
上⾯的输出this.name没有信息,如下进⾏修改就可以了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//定义⼀个stu学⽣对象,内有:两个属性、⼀个⽅法。
const stu = {
name:"张三",
likes:['吃饭','睡觉','敲代码'],
printLikes:function(){
let self = this;
//使⽤map遍历likes属性,并输出信息
this.likes.map(function(like){
//此处的this代表的是window对象,⽽⾮stu对象
console.log(`${self.name} 喜欢 ${like}`);
});
}
};
stu.printLikes(); //使⽤stu对象调⽤⾃⼰的⽅法
/* 输出结果:
张三 喜欢 吃饭
张三 喜欢 睡觉
张三 喜欢 敲代码
*/
</script>
</body>
</html>
使⽤箭头函数后的效果
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//定义⼀个stu学⽣对象,内有:两个属性、⼀个⽅法。
const stu = {
name:"张三",
likes:['吃饭','睡觉','敲代码'],
printLikes:function(){
//使⽤map遍历likes属性,并输出信息
this.likes.map(like => {
//箭头函数中没有⾃⼰的this,故此处this是继承⽗作⽤域的。
//⽽且是在定义的时候已指定,不会随着调⽤⽽改变。
console.log(`${this.name} 喜欢 ${like}`);
});
}
};
stu.printLikes(); //使⽤stu对象调⽤⾃⼰的⽅法
/* 输出结果:
张三 喜欢 吃饭
张三 喜欢 睡觉
张三 喜欢 敲代码
*/
</script>
</body>
</html>
4、箭头函数使⽤注意点
- 函数体内的this对象,就是定义时所在的对象,⽽不是使⽤时所在的对象。
- 不可以当作构造函数,也就是说,不可以使⽤new命令,否则会抛出⼀个错误。
- 当你真的需要this的时候,如为对象添加普通⽅法或事件绑定回调函数使⽤箭头函数,可能获取不
到this。
不可以使⽤arguments对象,该对象在函数体内不存在。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//1.箭头函数不可以作为构造函数使⽤
const Stu1 = (name,age)=>{
this.name = name;
this.age = age;
}
//要改成常规函数如下:
const Stu2 = function(name,age){
this.name = name;
this.age = age;
}
//实例化
//s = new Stu1("zhangsan",20);//报错:TypeError: Stu is not a constructor
s = new Stu2("zhangsan",20); //正常
console.log(s); //Stu2 {name: "zhangsan", age: 20}
//定义Stu类
const Stu = function(name,age){
this.name = name;
this.age = age;
}
s = new Stu("zhangsan",20); //正常实例化
//为s原型对象添加⼀个getInfo⽅法,使⽤箭头函数,⾥⾯的this是window对象
Stu.prototype.getInfo = ()=>{
return `我叫${this.name},今年${this.age}岁`;
}
//改成常规函数
Stu.prototype.getInfo2 = function(){
return `我叫${this.name},今年${this.age}岁`;
}
console.log(s.getInfo()); //我叫,今年undefined岁
console.log(s.getInfo2()); //我叫zhangsan,今年20岁
</script>
</body>
</html>
上⾯四点中,第⼀点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。
总结
本期我们讲解了函数的扩展的相关内容,下一期我们讲解数组的扩展。