例子1: let x = 1; function func (x, y = x) { console.log(y) // 输出2 } func(2) 例子二: let x = 1; function f(y = x) { let x = 2; console.log(y); // 输出1 } f() 例子三:报错 function f(y = x) { let x = 2; console.log(y); } f() // ReferenceError: x is not defined
function add (...value) { let sum = 0; for (let i of value) { sum += i; } return sum; } add(3, 5, 7); // 15
注意点编程
见下面几个例子:数组
function factorial(n) { if (n === 1) return 1; return n * factorial(n - 1); } factorial(5)
复杂度为o(n) 太大会形成堆栈溢出app
function factorial(n, total) { if (n === 1) return total; return factorial(n - 1, n * total); } factorial(5, 1) //
复杂度为哦o(1)编程语言
尾递归函数的改写:函数式编程
尾递归的实现,每每须要改写递归函数,确保最后一步只调用自身。作到这一点的方法,就是把全部用到的内部变量改写成函数的参数函数
递归本质上是一种循环操做。纯粹的函数式编程语言没有循环操做命令,全部的循环都用递归实现,这就是为何尾递归对这些语言极其重要。 对于其余支持“尾调用优化”的语言(好比 Lua,ES6),只须要知道循环能够用递归代替,而一旦使用递归,就最好使用尾递归。优化
解决方案: 一、蹦床函数的一个实现,它接受一个函数f做为参数。只要f执行后返回一个函数,就继续执行。 注意,这里是返回一个函数,而后执行该函数,而不是函数里面调用函数,这样就避免了递归执行,从而就消除了调用栈过大的问题。this
例子:rest
function trampoline(f) { while (f && f instanceof Function) { f = f(); } return f; } function sum(x, y) { if (y > 0) { return sum.bind(null, x + 1, y - 1); } else { return x; } } trampoline(sum(1, 100000)) // 100001
二、真的优化方案code
function tco(f) { var value; var active = false; var accumulated = []; return function accumulator() { accumulated.push(arguments); if (!active) { active = true; while (accumulated.length) { value = f.apply(this, accumulated.shift()); } active = false; return value; } }; } var sum = tco(function(x, y) { if (y > 0) { return sum(x + 1, y - 1) } else { return x } }); sum(1, 100000)