我以为我知道什么是关闭,但我不太确定阅读一些文章的反应。
该功能是否在" thunk" ? (对我而言,这是一个关闭,我从一篇关于反应https://spin.atomicobject.com/2016/10/05/form-validation-react/)的博客文章中看到了这一点
作者解释:"接下来,让我们看一下ruleRunner函数。 ruleRunner是一个thunk,或一个返回函数的函数。 "
export const ruleRunner = (field, name, ...validations) => {
return (state) => {
for (let v of validations) {
let errorMessageFunc = v(state[field], state);
if (errorMessageFunc) {
return {[field]: errorMessageFunc(name)};
}
}
return null;
};
};
相反,我认为thunk是"一个包含所有上下文(状态,函数等)的函数,以便将来执行某种逻辑。"来自:http://www.austinstory.com/what-is-a-thunk-in-javascript/
const add = (x,y) => x + y;
const thunk = () => add(1,2);
thunk() // 3
所以对我来说,第一篇文章的作者是错的,他给出了一个关闭的描述和例子,而不是一个thunk。但我可能错了,这就是我提出这个问题的原因。
第一篇文章的作者是错误的是什么是thunk并且说thunk是一种特定类型的闭包是正确的"它包含它将需要的所有上下文(状态,函数等)在未来实施某种逻辑。"
答案 0 :(得分:5)
“ruleRunner是一个thunk,或者是一个返回函数的函数。”
不,那是垃圾。返回函数的函数称为higher-order function。 返回的函数通常是closure。
我认为thunk是“一个包含所有上下文(状态,函数等)的函数,以便在将来执行某种逻辑。”
是的,这听起来很合理。这类似于一个闭包,但是一个闭包通常需要一些进一步的参数而thunk没有 - 它只需要开始执行。
答案 1 :(得分:2)
闭包是指独立(自由)变量的函数(在本地使用但在封闭范围内定义的变量)。换句话说,这些函数“记住”它们的创建环境。
本质上,闭包是一个代码块,可以在以后执行,但它保留了首次创建它的环境,因此被封闭到该范围。 thunk是一个子程序,通常是自动创建的,以帮助调用另一个子程序,因此thunk可以是一个闭包,但不是所有的thunk都是闭包。
Thunk是一个简单的辅助函数,可以是局部或全局封闭的,而闭包只在本地绑定到它初始化的范围。