“ return()=> local;”是什么?在此关闭中进行?

时间:2018-12-19 23:56:28

标签: javascript return closures

我正在通过阅读“ Eloquent Javascript”来学习JavaScript,并且对第3章(函数)的“ Closures”部分感到困惑。

在先前的部分中,我了解了箭头功能以及如何将其用作匿名功能。我最初的想法是,这是一个匿名函数示例,我现在还不太熟悉。

特别是,我对“()=> local”对退货的作用感到困惑。

function wrapValue(n) {
  let local = n;
  return () => local;
}

let wrap1 = wrapValue(1);
let wrap2 = wrapValue(2);
console.log(wrap1());
// → 1
console.log(wrap2());
// → 2

以下是该章的链接: Eloquent Javascript - Ch. 3 "Functions"

谢谢!

2 个答案:

答案 0 :(得分:3)

function wrapValue(n) {
   let local = n;
   return () => local;
}

与写作相同(没有“ this”的好处)

function wrapValue(n) {
   let local = n;
   return function() {
        return local;
   }
}

该函数返回另一个使用传递的参数的函数。这称为Curry function

console.log(typeof wrapValue(2)); // prints "function"
console.log(wrapValue(2)()); // prints "2"

这是一个更好的例子

function multiple(a) {
    return (b) => a*b;
}

console.log([1,2,3,4].map(multiple(2)); // prints "[2,4,6,8]"

您可以在数组中轻松使用咖喱函数

答案 1 :(得分:2)

在javascript函数中创建作用域。例如:

function scoped(){
  let local = 10;
  console.log(local) // this works local is within scope
}

scoped() // logs:

console.log(local) // error -- local doesn't exist out here.

scoped之外的local不存在。

一个函数内部的一个函数可以访问整个范围。如此有效:

function scoped() {
  let local = 10;
  function f() {
    console.log(local) // this works local is within scope
  }
  f()
}

scoped()

但是,如果您返回引用该函数范围的函数,会发生什么?事实证明,内部函数带有整个范围。这是一个关闭:

function scoped(){
  let local = 10;
  function f(){
    console.log(local) // this works local is within scope
  }
  return f
}

f = scoped()
f() // can still see local

// but nobody else out here can:
console.log(local) // still an error

这使您可以做一些非常漂亮的事情—重要的是可以保留某些变量的私有性,但仍可以使用闭包对其进行操作。

例如,这是一个不需要全局范围内变量的计数器:

function counter(){
  let count = 0
  return () => count++
}

let c = counter()

console.log(c())  // it can count but there's not count variable in scape
console.log(c())
console.log(c())

使用全局计数变量执行此操作很麻烦,并且可能会使代码的其他部分与全局变量发生冲突。以上,c函数之外的其他函数均无法访问计数器。实际上,您可以创建几个独立的对象:

function counter(){
  let count = 0
  return () => count++
}

let c = counter()
let d = counter()

console.log("c:", c())  // it can count but there's not count variable in scape
console.log("c:", c())
console.log("d:", d())  // d has it's own closure
console.log("d:", d())
console.log("c:", c())

闭包可以做很多事情,它们在Javascript中很重要。值得花时间真正理解它们。