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"功能"
提前致谢!
在 javascript 函数中创建作用域。例如:
\n\nfunction 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之外scoped local不存在。
函数内的函数可以访问整个作用域。所以这有效:
\n\nfunction 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但是,如果您返回引用该函数作用域的函数,会发生什么情况呢?事实证明,内部函数携带了整个作用域。这是一个闭包:
\n\nfunction 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 errorRun Code Online (Sandbox Code Playgroud)\r\n这允许您做一些非常巧妙的事情 \xe2\x80\x94 一个重要的事情是您可以将某些变量保留为私有,但仍然可以通过闭包操作它们。
\n\n例如,这里的计数器不需要全局范围内的变量:
\n\nfunction 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使用全局计数变量执行此操作很混乱,并且存在代码的其他部分与全局变量发生冲突的风险。上面,除了c函数之外没有任何东西可以访问计数器。事实上你可以制作几个独立的:
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使用闭包可以做很多事情,它们在 Javascript 中很重要。花时间去真正理解它们是值得的。
\n