如果一个javascript变量位于类之外,但位于模块的闭包内,它是否私有?

鲍勃

我从https://facebook.github.io/flux/docs/todo-list.html#content遇到了以下代码,并遇到了这个问题,因为该网站宣布

该对象(_todos)包含所有单独的待办事项。因为此变量位于类之外,但在模块的关闭之内,所以它保持私有状态-不能从模块外部直接更改。

这是真的?据我所知,似乎_todos是一个全局对象。

var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
var TodoConstants = require('../constants/TodoConstants');
var assign = require('object-assign');

var CHANGE_EVENT = 'change';

var _todos = {}; // collection of todo items

/**
 * Create a TODO item.
 * @param {string} text The content of the TODO
 */
function create(text) {
  // Using the current timestamp in place of a real id.
  var id = Date.now();
  _todos[id] = {
    id: id,
    complete: false,
    text: text
  };
}

/**
 * Delete a TODO item.
 * @param {string} id
 */
function destroy(id) {
  delete _todos[id];
}

var TodoStore = assign({}, EventEmitter.prototype, {

  /**
   * Get the entire collection of TODOs.
   * @return {object}
   */
  getAll: function() {
    return _todos;
  },

  emitChange: function() {
    this.emit(CHANGE_EVENT);
  },

  /**
   * @param {function} callback
   */
  addChangeListener: function(callback) {
    this.on(CHANGE_EVENT, callback);
  },

  /**
   * @param {function} callback
   */
  removeChangeListener: function(callback) {
    this.removeListener(CHANGE_EVENT, callback);
  },

      dispatcherIndex: AppDispatcher.register(function(payload) {
        var action = payload.action;
        var text;

        switch(action.actionType) {
          case TodoConstants.TODO_CREATE:
            text = action.text.trim();
            if (text !== '') {
              create(text);
              TodoStore.emitChange();
            }
            break;

          case TodoConstants.TODO_DESTROY:
            destroy(action.id);
            TodoStore.emitChange();
            break;

          // add more cases for other actionTypes, like TODO_UPDATE, etc.
        }

        return true; // No errors. Needed by promise in Dispatcher.
      })

})    ;

module.exports = TodoStore;
达尼洛兹

是的,这是真的。

在您的示例_todos中,作用域仅限于模块(即文件)本身,而不是全局的。

在node.js中,变量的作用域为模块。而且它不会成为全球性的(就像在浏览器上一样)。作为参考,请参阅此问题

如果您使用browserify之类的东西,这仍然是正确的,因为从顶级角度来看,browserify使用立即调用的函数表达式来加载依赖关系(即模块)的映射,这些依赖关系基本上包装在具有自己作用域的函数中(而不是全局变量)。范围)。有关如何工作的更多信息,请参见此处

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果全局函数使用非局部变量,那么它是一个闭包是否正确?

为什么允许通过原型继承访问另一个闭包范围内的私有变量?

闭包如何帮助函数了解上一个函数调用的私有变量

在一个模块中使用除一个变量之外的所有变量-“ only”是否相反?

如果在多个函数作用域中使用变量,是否应该在私有类中声明一个变量?

如何通过位于同一 vpc 和私有子网内的 lambda 函数向 vpc 内的 emr 集群添加一个步骤?

如何单击第一个按钮,该按钮位于具有span类的特定div中?(使用javascript)

在elisp中围绕私有函数创建一个闭包

当一个模块位于另一个模块的父目录中时,如果模块之间存在循环依赖关系,则导入的模块未定义

创建一个新的变量,并检查它是否是空的,如果一个

Javascript:如果位于另一个文件中,则无法创建新对象

JavaScript在将WeakMap用于私有变量时扩展了一个类

在 javascript 库中的导出类之外声明一个函数是实现私有函数的好方法吗?

iis网站位于另一个站点内,是否可能/

如何使用javascript中的闭包访问函数内另一个作用域中的变量?

用dplyr汇总-一个变量始终位于底部

如何知道一个点是否位于外圆?

div位于中心的另一个div内

如果 Jenkins GUI 位于 aws vpc 的私有子网中,是否可以访问它?

Pandas:检查一个日期列是否位于两个日期列之间,如果 true 填充输出

如果一个类只有一个通过require启用的成员函数,它是否仍然可以模棱两可地重载?

类具有2个同步方法。.当一个线程位于第二个方法内时,另一个线程可以进入第一个方法吗?

获取类的“所有者”,如果它是另一个类的属性

如果一个类使用类似的方法实现了多个接口,它是否会重载?

eventListener在应该位于函数私有范围内的变量上工作

如果多个类具有一个共同的静态变量,它们是否将被共享(在同一范围内?)

是否可以缩小除一个包之外的所有包?

这个“如果e是一个包,则获取一个模板名称,否则获取一个变量名称”是否有效?

如何让一个类从位于另一个类中的对象数组列表中打印出字符串变量?