高阶函数定义为:
以函数作为参数和/或返回函数作为返回值的函数。
关闭示例:
function outer() {
const name = 'bob';
function inner(lastName) {
console.log('bob' + lastName);
}
return inner;
}
像上面定义的那样的闭包是否适合此类别?看来他们将函数作为返回值返回了,对吧?
答案 0 :(得分:2)
闭包确实不并不意味着它必须由函数返回。在JavaScript中,每个 函数实际上 是一个闭包。闭包通常是可以访问声明上下文的范围的函数。
function outer(lastName)
{
const name = 'Bob';
function inner(lastName)
{
// here we have access to the outer function's scope
// thus it IS a closure regardless whether we return the function or not
console.log(name + ' ' + lastName);
}
inner(lastName);
}
outer('Marley');
更具体地说:闭包实际上是将当前作用域绑定到子上下文的概念。我们经常简短地对获得这种映射上下文的函数说“关闭”。声明上下文并不意味着声明时间,更多的是声明上下文在其调用时处于活动状态。此行为用于将上下文绑定到内部函数,并返回具有绑定上下文的函数:
function outer(lastName)
{
// this is the declaration context of inner().
const name = 'Bob';
function inner()
{
// here we have access to the outer function's scope at its CALL time (of outer)
// this includes the constand as well as the argument
console.log(name + ' ' + lastName);
}
return inner;
}
var inner1 = outer('Marley');
var inner2 = outer('Miller');
function output()
{
// this is the caller context, the const name ist NOT used
const name = 'Antony';
inner1(); // outputs 'Bob Marley'
inner2(); // outputs 'Bob Miller'
}
答案 1 :(得分:0)
是的,那些是返回一个函数的函数。
答案 2 :(得分:0)
闭包允许从内部函数访问外部函数的作用域。闭包通常用于为对象提供数据隐私。
高阶函数是接收函数作为参数或返回函数作为输出的函数。
//This function is a higher order function
function higherOrderFunction(f, ...outerArgs) {
return function (...innerArgs) {
// It has access to outer args. So we can say this function has a closure over the scope of outer function
let args = [...outerArgs, ...innerArgs];
return f.apply(this, args);
};
}
const f = function (x, y, z) { return x * y * z };
higherOrderFunction(f, 1)(1, 3) // => (1*2*3);