高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出。
高阶函数形式1:接收函数作为参数
function fn(callback){
callback&&callback();
}
fn(function(){alert('hi')}
高阶函数形式2:接收函数作为参数
function fn(){
return function() {}
}
fn();
上面的两个fn 都是一个高阶函数,只要满足接收函数作为参数或将函数作为返回值输出的一个条件就叫做高阶函数。
函数也是一种数据类型,同样可以作为参数,传递给另外一个参数使用。 最典型的就是作为回调函数。
同理函数也可以作为返回值传递回来
闭包
闭包简单理解就是,在一个作用域中可以访问另外一个函数内部的局部变量,这个局部变量所在的函数就叫做闭包。
闭包作用:
1:延伸变量的作用范围。 (闭包函数执行完之后局部变量不会马上销毁,会等到调用这个变量的函数都执行完毕才销毁)
2:隐藏变量/封装变量
缺点:太多局部变量占用内存而不销毁可能会造成内存溢出。
返回一个函数是闭包实现的主要原理。
function fn1(){ // fn1 就是闭包函数
var num = 10;
function fn2(){
console.log(num); // 10
}
fn2()
}
fn1();
或者下面这种形式
function fn() {
var num = 10;
return function {
console.log(num); // 10
}
}
var f = fn();
f()
在 chrome 调试工具进行断点调试时,右边 Scope 选项(Scope 作用域的意思)里面会有两个参数(global 全局作用域、local 局部作用域)。 当执行到 fn2( )/fn( ) 时,Scope 里面会多一个 Closure 参数 ,这就表明产生了闭包。