1.函数表达式、函数声明、箭头函数
2.使用函数实现递归
函数通常以函数声明的方式定义,举例:
function kkb(a,b){
return a + b ;
}
注意:函数定义最后没有加分号 函数表达式,举例:
let kkb = function (a,b){
return a + b ;
};
箭头函数 ES6定义了新增的使用箭头函数的(=>)语法定义函数表达式的能力,使得箭头函数实例化的函数对象与正式的函数表达式创建的函数对象行为是相同的,任何可以使用函数表达式的地方,都可以使用箭头函数。 例子走一个:
let kkb = (a,b)=>{
return a + b ;
};
let functionKkb = (a,b){
return a + b ;
};
console.log( kkb(1,2) ) ; //3
console.log( function(1,2) ) ; //3
箭头函数简洁的语法非常适合嵌入函数的场景。
let sun = [1,2,3];
console.log(sun.map(function(i){return i+2}));//[3,4,5]
cosole.log(sun.map((i)=>{return i + 2}));//[3,4,5]
如果只有一个参数,那也可以不用花括号;只有没有参数,或者多个参数的情况下,才需要使用花括号。 这两种写法都有效;
let sun = (x) = >{ return x + 1 ; };
let sunshine = x =>{ return x + 1 ;};
没有参数需要括号;
let sun2 = () =>{ return Math.random(); };
多个参数需要括号;
let sunshine2 = ( a , b ) =>{ return a + b };
箭头函数虽然语法简洁,但是很多场景也是不适用的,箭头函数不能使用argument、super、new.target,也不能用作构造函数,此外,箭头函数也没有propertype属性。
函数名可以有多个,因为函数名就是指向函数的指针,所以他们跟其他包含对象指针的变量具有相同的行为。 举个例子:
function kkb (a,b){
return a+b;
}
console.log(kkb(2,2)); //4
let bigKkb = kkb ;
console.log(bigKkb(2,2)); //4
sum = null ;
console.log(bigKkb(2,2));//4
使用不带括号的函数名会访问函数指针,而不会执行函数,此时kkb、bigKkb都指向同一个函数,调用bigKkb()也可以返回结果,把kkb设置为null,就切断了它与函数之间的联系,而bigKkb()还是可以正常调用,没问题。
递归函数 通常的形式是一个函数通过名称调用自己,
function Deep(num){
if(num <= 1){
return 1;
}else{
return num * Deep(num - 1);
}
};
这是一个经典的递归阶乘函数,虽然这样写是可以的,但是如果把这个函数赋值给其他变量,就会报错。
let bigDeep = Deep ;
Deep = null ;
console.log( bigDeep(2)) ; //报错
在写递归函数时使用arguments.callee可以避免这个问题。
function Deep(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num - 1);
}
};
arguments.callee 可以确保无论通过什么样的变量调用这个函数都不会出问题,因此在编写递归函数的时候, arguments.callee 时引用当前函数的首选。 在严格模式下运行的代码时不能访问 arguments.callee的,因此访问报错,此时可以使用命名函数表达式达到目的。
const kkb = (function f(num){
if(num <= 1){
return 1;
}else{
return num * f(num - 1);
}
});