rest参数
add = (...value) => {
console.log(value instanceof Array);
}
add(1,2,3,4,5)
name属性
let add2 = function(...values) {
let sum;
for(let value of values){
sum += value;
}
return sum;
}
console.log(add.name);
console.log(add2.name);
function foo1(){
setTimeout(()=>{
console.log('id:',this.id);
},100);
}
function foo2(){
setTimeout(function(){
console.log('--id:',this.id);
},100);
}
let id = 21;
foo1.call({id:42});
foo2.call({id:50});
ES7 绑定this
foo::bar
等价于bar.bind(foo)
foo::bar(...arguments)
等价于bar.bind(foo,arguments)
尾调用(函数式编程)指某个函数的最后一步调用另一个函数
function f(x){
return
}
尾递归
不会发生栈溢出,节省内存
// eg1
function factorial(n){
if(n === 1) return 1;
return factorial(n-1) * n;
}
console.log("递归",factorial(5));
function factorialWDG(n,total){
if(n === 1) return total;
return factorialWDG(n-1,n * total);
}
console.log("尾递归",factorialWDG(5,1));
// eg2
function Fibonacci(n){
if(n <= 1) return 1;
return Fibonacci(n-1) + Fibonacci(n-2);
}
// 问题,栈溢出
console.log("递归",Fibonacci(10));
function FibonacciWDG(n,ac1 = 1,ac2 = 1){
if(n <= 1) return ac2;
return FibonacciWDG(n-1,ac2,ac1 + ac2);
}
console.log("尾递归",FibonacciWDG(1000));
柯里化
意思是将多参数的函数转换成单参数的形式
function currying(fn,n){
return function(m){
return fn.call(this,m,n);
};
}
function tailFactorial(n,total){
if(n === 1) return total;
return tailFactorial(n-1,n * total);
}
const factorialKL = currying(tailFactorial,1);
console.log("柯里化",factorialKL(5));
// method two
function factorial_2(n,total = 1){
if(n === 1) return total;
return factorial_2(n-1,n * total);
}
console.log("method 2",factorial_2(5));