什么是"return()=> local;" 在这个关闭?

Tuc*_*ker 5 javascript closures return

我正在通过阅读"Eloquent Javascript"来学习javascript,并且对第3章(功能)中的"闭包"部分感到困惑.

在前面的部分中,我了解了箭头函数以及它们如何用作匿名函数.我最初的想法是,这是一个匿名的函数示例,我还不熟悉.

特别是,我对"(=)>本地"对/返回的内容感到困惑.

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

let wrap1 = wrapValue(1);
let wrap2 = wrapValue(2);
console.log(wrap1());
// ? 1
console.log(wrap2());
// ? 2
Run Code Online (Sandbox Code Playgroud)

这是一章的链接: Eloquent Javascript - Ch.3"功能"

提前致谢!

Mar*_*yer 4

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

\n\n

\r\n
\r\n
function scoped(){\r\n  let local = 10;\r\n  console.log(local) // this works local is within scope\r\n}\r\n\r\nscoped() // logs:\r\n\r\nconsole.log(local) // error -- local doesn\'t exist out here.
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

之外scoped local不存在。

\n\n

函数内的函数可以访问整个作用域。所以这有效:

\n\n

\r\n
\r\n
function scoped() {\r\n  let local = 10;\r\n  function f() {\r\n    console.log(local) // this works local is within scope\r\n  }\r\n  f()\r\n}\r\n\r\nscoped()
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

但是,如果您返回引用该函数作用域的函数,会发生什么情况呢?事实证明,内部函数携带了整个作用域。这是一个闭包:

\n\n

\r\n
\r\n
function scoped(){\r\n  let local = 10;\r\n  function f(){\r\n    console.log(local) // this works local is within scope\r\n  }\r\n  return f\r\n}\r\n\r\nf = scoped()\r\nf() // can still see local\r\n\r\n// but nobody else out here can:\r\nconsole.log(local) // still an error
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

这允许您做一些非常巧妙的事情 \xe2\x80\x94 一个重要的事情是您可以将某些变量保留为私有,但仍然可以通过闭包操作它们。

\n\n

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

\n\n

\r\n
\r\n
function counter(){\r\n  let count = 0\r\n  return () => count++\r\n}\r\n\r\nlet c = counter()\r\n\r\nconsole.log(c())  // it can count but there\'s not count variable in scape\r\nconsole.log(c())\r\nconsole.log(c())
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

使用全局计数变量执行此操作很混乱,并且存在代码的其他部分与全局变量发生冲突的风险。上面,除了c函数之外没有任何东西可以访问计数器。事实上你可以制作几个独立的:

\n\n

\r\n
\r\n
function counter(){\r\n  let count = 0\r\n  return () => count++\r\n}\r\n\r\nlet c = counter()\r\nlet d = counter()\r\n\r\nconsole.log("c:", c())  // it can count but there\'s not count variable in scape\r\nconsole.log("c:", c())\r\nconsole.log("d:", d())  // d has it\'s own closure\r\nconsole.log("d:", d())\r\nconsole.log("c:", c())
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

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

\n