【问题标题】:Redux ToDo Example on GithubGithub 上的 Redux ToDo 示例
【发布时间】:2018-02-25 00:36:57
【问题描述】:

我正在阅读 Redux 文档并从此处的 Todo 示例开始:

https://github.com/reactjs/redux/tree/master/examples/todos

它工作正常。不过有一些基本的东西我不明白。以下是 index.js 文件中定义操作的代码 sn-p:

let nextTodoId = 0
export const addTodo = (text) => ({
  type: 'ADD_TODO',
  id: nextTodoId++,
  text
})

整个文件可以在以下网址看到:

https://github.com/reactjs/redux/blob/master/examples/todos/src/actions/index.js

如您所见,变量 nextTodoId 是在“addtodo”函数之外初始化的。我想知道为什么每次调用函数时“nextTodoId”变量都不会重置为 0?

谁能解释一下?

感谢您的宝贵时间。

【问题讨论】:

    标签: javascript reactjs redux


    【解决方案1】:

    nextTodoId 变量声明在与addTodo 函数相同的范围(模块范围)中。 模块文件中的内容被视为包含在范围闭包中,就像函数闭包一样。 模块只评估一次,即使它们被多次导入。因此,nextTodoId 变量只声明一次,每次调用addTodo 函数时都会使用nextTodoId 变量的当前值。

    【讨论】:

    • 后续问题:nextTodoId 只能由三个模块函数访问对吗?因为 is 没有被导出
    • 正确,它的范围是那个模块
    • 是的。所有不只导出的变量和函数都可以在模块中访问。
    • 谢谢大家。所有的答案都是有帮助的。我将代码放入调试器并检查答案。看来我只能接受一个答案:(
    • 欢迎投票(点击向上箭头)任何有帮助的答案!这是感谢回答者的好方法。这包括这个公认的答案。
    【解决方案2】:

    nextTodoId 属于 addTodo 之外的范围。因此,该变量可以从 addTodo 访问,但不归其所有,因此即使您从函数返回,该变量也将存在。

    【讨论】:

      【解决方案3】:

      这是 importrequire 在 Javascript 模块中如何工作的函数。模块加载器运行每个导入/必需文件中的代码一次。之后,它会缓存结果,并且将来导入或需要该文件的任何其他模块都会获得缓存的版本。

      所以nextTodoId 仅在该文件第一次为imported/required 时才被初始化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 2011-10-31
        • 1970-01-01
        • 2015-01-07
        • 1970-01-01
        相关资源
        最近更新 更多