gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:33:20 25 4
gpt4 key购买 nike

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

This object (_todos) contains all the individual to-do items. Because this variable lives outside the class, but within the closure of the module, it remains private — it cannot be directly changed from outside of the module.

这是真的吗?据我所知,_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 中,变量的作用域是模块。而且它不会成为全局性的(就像在浏览器上一样)。有关引用,请参阅 this question .

如果你使用类似 browserify 的东西这仍然是正确的,因为从顶层的 Angular 来看,browserify 使用立即调用的函数表达式来加载依赖项(即模块)的映射,这些依赖项基本上包装在具有自己的范围(不是全局范围)的函数中。可以找到有关其工作原理的更多信息 here .

关于javascript - 如果一个 javascript 变量位于类之外,但位于模块的闭包内,它是私有(private)的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32296679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com