thunk和闭包之间的区别

时间:2017-05-17 21:47:57

标签: javascript

我以为我知道什么是关闭,但我不太确定阅读一些文章的反应。

该功能是否在" 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是一种特定类型的闭包是正确的"它包含它将需要的所有上下文(状态,函数等)在未来实施某种逻辑。"

2 个答案:

答案 0 :(得分:5)

  

“ruleRunner是一个thunk,或者是一个返回函数的函数。”

不,那是垃圾。返回函数的函数称为higher-order function返回的函数通常是closure

  

我认为thunk是“一个包含所有上下文(状态,函数等)的函数,以便在将来执行某种逻辑。”

是的,这听起来很合理。这类似于一个闭包,但是一个闭包通常需要一些进一步的参数而thunk没有 - 它只需要开始执行。

答案 1 :(得分:2)

  

闭包是指独立(自由)变量的函数(在本地使用但在封闭范围内定义的变量)。换句话说,这些函数“记住”它们的创建环境。

本质上,闭包是一个代码块,可以在以后执行,但它保留了首次创建它的环境,因此被封闭到该范围。 thunk是一个子程序,通常是自动创建的,以帮助调用另一个子程序,因此thunk可以是一个闭包,但不是所有的thunk都是闭包。

  

Thunk是一个简单的辅助函数,可以是局部或全局封闭的,而闭包只在本地绑定到它初始化的范围。

相关问题