Что значит "return () => local;"делать в этом закрытии? - PullRequest
0 голосов
/ 20 декабря 2018

Я изучаю javascript, читая «Eloquent Javascript», и меня смущает раздел «Замыкания» в главе 3 (Функции).

В предыдущих разделах я узнал о функциях стрелок и о том, как они могут бытьиспользуется в качестве анонимных функций.Мои первые мысли были о том, что это пример анонимной функции, и я просто еще не знаком.

В частности, я не совсем понимаю, что "() => 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

Вот ссылка на главу: Красноречивый Javascript - Ch.3 «Функции»

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

В функции 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())

Делать это с глобальной переменной count сложно и рискованно, поскольку некоторые другие части кода конфликтуют с глобальной переменной.Выше ничего кроме функции 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.Стоит потратить время, чтобы по-настоящему понять их.

0 голосов
/ 20 декабря 2018
function wrapValue(n) {
   let local = n;
   return () => local;
}

Это то же самое, что и запись (без преимуществ "this")

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

Это функция, которая возвращает другую функцию, которая использует переданные параметры.Это называется функция Карри

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]"

Вы можете очень легко использовать функции карри с массивами

...