闭包是高阶函数吗?

时间:2018-12-22 22:41:46

标签: javascript closures

高阶函数定义为:

  

以函数作为参数和/或返回函数作为返回值的函数。

关闭示例:

function outer() {
  const name = 'bob';

  function inner(lastName) {
    console.log('bob' + lastName);
  }

  return inner;
}

像上面定义的那样的闭包是否适合此类别?看来他们将函数作为返回值返回了,对吧?

3 个答案:

答案 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);