1 箭头函数
不得不说箭头函数,好用指向性强
下面的sum就是标准的箭头函数,省略掉了function这个关键字:
const sum = (a,b) => {
return a + b;
}
console.log(sum(3,4));
=>是一个完整的运算符,之间不能有空格。
如果函数体内只有一行语句,可以省略{}和return。 const sum = (a,b) => a + b; console.log(sum(45,5));
反过来,如果函数体内有多条语句,此时必须写{}和return单词。
箭头函数的美,最能体现在连续箭头。当外层函数被调用的时候,将返回内层的函数。调用的时候可以加两层圆括号。
const fn = (a , b) => (m) => {
return a + b + m;
}
console.log(fn(3,4)(5)); //12
等价于:
const fn = function(a,b){
return function(m){
return a + b + c
}
}
箭头函数中的this是定义时所处的上下文,和如何调用无关!
比如下面有一个obj对象,这个对象的b方法是用箭头函数写的。这个箭头函数所在的最外层函数体是window域。所以this不管b函数如何被调用,一律是window对象。
var a = 9;
var obj = {
a : 1 ,
b : () => {
console.log(this.a);
}
}
obj.b(); //9 ,
因为虽然是对象打点调用函数,但是由于函数是箭头函数,所以之前学习的规则2,不生效。一律上下文是window对象。
甚至call、apply失效:
var haha = {
a : 8888
}
obj.b.call(haha); //9
obj.b.apply(haha); //9
node没有全局window对象,所以在node 里面记载的都是undefined;
this在箭头函数中是固定的,这个性质是我们应该防止的、加以警惕的;而不是利用的。
箭头函数有几个使用注意点。
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
4) 不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
2 bind()
bind表示给一个函数定死上下文,而无论它如何被调用。
比如下面有一个函数fun,函数体输出this.a。
我们在后面有一个.bind()语句,彻底将fun函数的上下文定死了,就是obj对象。
无论fun函数如何被调用,一律上下文是obj对象。
function fun(){
console.log(this.a);
}
//这是一个对象
var obj = {
a : 233 ,
b : 886
}
//这是另一个对象
var another = {
a : 6666666666666
}
//定死上下文为obj对象
fun = fun.bind(obj);//把fun的上下文绑给了obj
fun(); //233
fun.call(another); //233,call失效了,
fun.apply(another); //233,apply失效了无论fun函数如何被调用,一律上下文是obj对象。
bind和call和apply有什么区别?
⦁ bind不调用函数,call和apply会调用函数。
⦁ bind能绑死上下文,call和apply是临时的。
3 默认参数
在形参列表中可以加等号运算符,表示参数的默认参数,当我们没有传入这个参数的时候,将自动使用这个默认参数。
const mianji = (r , pi = 3.14) => {
return pi * r * r;
}
console.log(mianji(10 , Math.PI)); //传了第二个参数,就是用第二个参数
console.log(mianji(10)); //没有第二个参数,将用默认的3.14