高阶函数,闭包,递归
高阶函数
高阶函数 是对其他函数进行操作的函数,它接收函数作为参数或者将函数作为返回值输出
<script>
// 接收函数作为参数
function fn(callback) {
callback && callback()
}
fn(function() {alert(‘hi’)})
</script>
<script>
function fn() {
// 将函数作为返回值输出
return function() {}
}
fn()
</script>
此时fn就是一个高阶函数
函数也是一种数据类型,同样可以作为参数,传递给另外一个参数使用。最典型的就是作为回调函数
闭包
闭包(closure)指有权访问另一个函数作用域中变量的函数------JavaScript高级程序设计
变量作用域
变量根据作用域的不同分为两种:全局变量和局部变量
1函数内部可以使用全局变量
2函数外部不可以使用全局变量
3当函数执行完毕,本作用域内的局部变量会销毁
简单理解就是,一个作用域可以访问另外一个函数内部的局部变量
// 闭包:fun这个函数作用域 访问了另一个函数 fn 里面的局部变量 num 这就是产生了闭包,fn是闭包
function fn() {
var num = 10
function fun() {
console.log(num) // 10
}
fun()
}
fn()
function fn() {
var num = 10
function fun() {
console.log(num)
}
return fun
}
}
var f = fn()
f()
闭包的主要作用
闭包的主要作用:延申了变量的作用域范围
闭包小案例
点击li输出当前li的索引
<ul class=”nav”>
<li>榴莲</li>
<li>臭豆腐</li>
<li>鲱鱼罐头</li>
<li>大猪蹄子</li>
</ul>
// 获取ul 和 li
var lis = document.querySelector(‘.nav’).querySelectorAll(‘li’)
for(var i = 0; i < lis.length; i++) {
// 利用for循环创建了4个立即执行函数
// 立即执行函数也称为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i这个变量
(function(i) {
// lis[i].onclick = function() {
console.log(i)
}
)(i)
}
递归
递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
简单理解:函数内部自己调用自己,这个函数就是递归函数
由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件return(递归函数的作用和循环效果一样,要加退出条件return结束)
利用递归函数求1~n的阶乘
function fn(n) {
If(n == 1) {
Return 1;
}
return n * fn(n - 1)
}
console.log(fn(3))
详细思路 假如用户输入的是3
// 3 * fn(3-1) 3fn(2)
// 3(2fn(1))
// 3(21) 32=6