高阶函数是什么?
高阶函数(higher-order-function)并不是JS中语言中所特有的东西,它适用于整个计算机领域,甚至数学领域。
高阶函数的定义比较简单:
A:接受一个或者多个函数作为输入
B:输出一个函数
在大部分计算机语言中,一个函数 的输入往往被看作是函数的参数,而一个函数的输出,往往被看作是函数的返回值。
JS中实现高阶函数
1.函数是一等公民
在JS语言中,函数被视为一等公民
什么是一等公民?就是函数可以像其他数据类型(数字、字符串、布尔等)一样,有权力出入任务场所,这一点在很多其他语言(比如Java、C#…)中是不太容易做到的。
函数可以保存到变量、作为参数传递、作为返回值返回
2.函数作为参数传递
用JS写一个函数定义,该函数要实现这样一个功能,将某件事重复做N次。
示例1:
function repeat(n, something) {
for (let i = 0; i < n; i++) {
something();
}
}
示例2:
function repeat(n, something) {
for (let i = 0; i < n; i++) {
something();
}
}
const func = function(){
console.log("hello"); }
repeat(10, func);
repeat(10, function(){
console.log("hello");
});
repeat(10, ()=>{ console.log("hello"); });
3.函数作为返回值
示例3:
function test(){
return function(a, b){
console.log(a + b);
}
}
什么是闭包?
闭包要满足两个条件:
A:一个函数中要嵌套一个内部函数,并且内部函数要访问外部函数的变量
B:内部函数要被外部引用
示例1:
function eat(){
var food = '鸡肉';
return function(){
console.log(food);
}
}
var look = eat();
look();
look();
自由变量
闭包就是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
什么是自由变量?
自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量
示例2:
function wrapper() {
let freeVar = 42;
function inner() {
return 2 * freeVar;
}
return inner;
}
闭包的作用域
虽然自由变量从闭包时起 “将和这个函数一同存在,即使已经离开了创造它的环境也不例外”,但我们必须搞清楚,闭包产生时的作用域。
示例3:
var scope = 'hello';
function echo(){
console.log(scope);
}
function wrapper(){
var scope = 'hello2';
echo();
}
echo();
wrapper();
示例4:
var scope = 'hello';
function echo(){
console.log(scope);
}
function wrapper(){
var scope = 'hello2';
function echo(){
console.log(scope);
}
echo();
}
echo();
wrapper();