我正在通过阅读“ 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"
谢谢!
答案 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中很重要。值得花时间真正理解它们。