我在这里问: node.js是否需要继承?
有人告诉我可以通过省略var将变量设置为全局范围。
这对我不起作用。
即:
_ = require('underscore');
不能使_在必需文件上可用。我可以设置express app.set
,但可以在其他地方使用。
有人可以确认这应该起作用吗?谢谢。
exports
。好多了。
我在这里问: node.js是否需要继承?
有人告诉我可以通过省略var将变量设置为全局范围。
这对我不起作用。
即:
_ = require('underscore');
不能使_在必需文件上可用。我可以设置express app.set
,但可以在其他地方使用。
有人可以确认这应该起作用吗?谢谢。
exports
。好多了。
Answers:
您可以这样使用global
:
global._ = require('underscore')
window
是全局对象。document
是的属性window
。
在节点中,可以通过“ global”或“ GLOBAL”对象设置全局变量:
GLOBAL._ = require('underscore'); // but you "shouldn't" do this! (see note below)
或更有用的...
GLOBAL.window = GLOBAL; // like in the browser
从节点源,您可以看到它们是彼此别名的:
node-v0.6.6/src/node.js:
28: global = this;
128: global.GLOBAL = global;
在上面的代码中,“ this”是全局上下文。对于commonJS模块系统(该节点使用哪个节点),模块内部的“ this”对象(即“您的代码”)不是全局上下文。为了证明这一点,请参见下面我在哪里喷出“ this”对象,然后喷出巨大的“ GLOBAL”对象。
console.log("\nTHIS:");
console.log(this);
console.log("\nGLOBAL:");
console.log(global);
/* outputs ...
THIS:
{}
GLOBAL:
{ ArrayBuffer: [Function: ArrayBuffer],
Int8Array: { [Function] BYTES_PER_ELEMENT: 1 },
Uint8Array: { [Function] BYTES_PER_ELEMENT: 1 },
Int16Array: { [Function] BYTES_PER_ELEMENT: 2 },
Uint16Array: { [Function] BYTES_PER_ELEMENT: 2 },
Int32Array: { [Function] BYTES_PER_ELEMENT: 4 },
Uint32Array: { [Function] BYTES_PER_ELEMENT: 4 },
Float32Array: { [Function] BYTES_PER_ELEMENT: 4 },
Float64Array: { [Function] BYTES_PER_ELEMENT: 8 },
DataView: [Function: DataView],
global: [Circular],
process:
{ EventEmitter: [Function: EventEmitter],
title: 'node',
assert: [Function],
version: 'v0.6.5',
_tickCallback: [Function],
moduleLoadList:
[ 'Binding evals',
'Binding natives',
'NativeModule events',
'NativeModule buffer',
'Binding buffer',
'NativeModule assert',
'NativeModule util',
'NativeModule path',
'NativeModule module',
'NativeModule fs',
'Binding fs',
'Binding constants',
'NativeModule stream',
'NativeModule console',
'Binding tty_wrap',
'NativeModule tty',
'NativeModule net',
'NativeModule timers',
'Binding timer_wrap',
'NativeModule _linklist' ],
versions:
{ node: '0.6.5',
v8: '3.6.6.11',
ares: '1.7.5-DEV',
uv: '0.6',
openssl: '0.9.8n' },
nextTick: [Function],
stdout: [Getter],
arch: 'x64',
stderr: [Getter],
platform: 'darwin',
argv: [ 'node', '/workspace/zd/zgap/darwin-js/index.js' ],
stdin: [Getter],
env:
{ TERM_PROGRAM: 'iTerm.app',
'COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET': '/tmp/launch-nNl1vo/ServiceProcessSocket',
TERM: 'xterm',
SHELL: '/bin/bash',
TMPDIR: '/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/',
Apple_PubSub_Socket_Render: '/tmp/launch-9Ga0PT/Render',
USER: 'ddopson',
COMMAND_MODE: 'unix2003',
SSH_AUTH_SOCK: '/tmp/launch-sD905b/Listeners',
__CF_USER_TEXT_ENCODING: '0x12D732E7:0:0',
PATH: '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/X11/bin',
PWD: '/workspace/zd/zgap/darwin-js',
LANG: 'en_US.UTF-8',
ITERM_PROFILE: 'Default',
SHLVL: '1',
COLORFGBG: '7;0',
HOME: '/Users/ddopson',
ITERM_SESSION_ID: 'w0t0p0',
LOGNAME: 'ddopson',
DISPLAY: '/tmp/launch-l9RQXI/org.x:0',
OLDPWD: '/workspace/zd/zgap/darwin-js/external',
_: './index.js' },
openStdin: [Function],
exit: [Function],
pid: 10321,
features:
{ debug: false,
uv: true,
ipv6: true,
tls_npn: false,
tls_sni: true,
tls: true },
kill: [Function],
execPath: '/usr/local/bin/node',
addListener: [Function],
_needTickCallback: [Function],
on: [Function],
removeListener: [Function],
reallyExit: [Function],
chdir: [Function],
debug: [Function],
error: [Function],
cwd: [Function],
watchFile: [Function],
umask: [Function],
getuid: [Function],
unwatchFile: [Function],
mixin: [Function],
setuid: [Function],
setgid: [Function],
createChildProcess: [Function],
getgid: [Function],
inherits: [Function],
_kill: [Function],
_byteLength: [Function],
mainModule:
{ id: '.',
exports: {},
parent: null,
filename: '/workspace/zd/zgap/darwin-js/index.js',
loaded: false,
exited: false,
children: [],
paths: [Object] },
_debugProcess: [Function],
dlopen: [Function],
uptime: [Function],
memoryUsage: [Function],
uvCounters: [Function],
binding: [Function] },
GLOBAL: [Circular],
root: [Circular],
Buffer:
{ [Function: Buffer]
poolSize: 8192,
isBuffer: [Function: isBuffer],
byteLength: [Function],
_charsWritten: 8 },
setTimeout: [Function],
setInterval: [Function],
clearTimeout: [Function],
clearInterval: [Function],
console: [Getter],
window: [Circular],
navigator: {} }
*/
**注意:关于设置“ GLOBAL._”,通常您应该这样做var _ = require('underscore');
。是的,您可以在每个使用下划线的文件中执行此操作,就像在Java中一样import com.foo.bar;
。由于文件之间的链接是“显式的”,因此这使查找代码的工作变得更加容易。轻度烦人,但这是一件好事。....这就是说教。
每个规则都有一个例外。我刚好有一个实例需要设置“ GLOBAL._”。我正在创建一个用于定义“ config”文件的系统,这些文件基本上是JSON,但是是用JS编写的,以提供更多的灵活性。这样的配置文件没有'require'语句,但是我希望它们能够使用下划线(整个系统基于下划线和下划线模板为前提),因此在评估“ config”之前,我将设置“ GLOBAL._”。是的,对于每条规则,某处都有一个例外。但是您最好有充分的理由,而不仅仅是“我厌倦了键入'require',所以我想打破常规”。
.js
文件中并require
在导出配置之前调用?
使用GLOBAL关键字的其他解决方案是在项目变大时进行维护/提高可读性的噩梦(+名称空间污染和错误)。我已经多次看到此错误,并且有解决它的麻烦。
使用JS文件,然后使用模块导出。
例:
globals.js
var Globals = {
'domain':'www.MrGlobal.com';
}
module.exports = Globals;
然后,如果要使用这些,请使用require。
var globals = require('globals'); //<< globals.js path
globals.domain //<< Domain.
globals.domain
呢?
像这样的全局名称空间呢? global.MYAPI = {}
global.MYAPI._ = require('underscore')
在camilo-martin评论后进行编辑:所有其他海报都谈到所涉及的不良模式。因此,撇开这些讨论,全局定义变量的最佳方法(OP的问题)是通过名称空间。
@tip:http ://thanpol.as/javascript/development-using-namespaces
require
是为了什么!可以使用名称空间,但不要全部global.foo = global.foo || {}
使用所有文件或其他内容。需要定义名称空间的文件。为孩子们做。
我同意,使用global / GLOBAL命名空间设置全局变量是不好的做法,并且从理论上讲,根本不使用它(理论上是可操作的词)。但是(是的,操作员)我确实使用它来设置自定义Error类:
// Some global/config file that gets called in initialisation
global.MyError = [Function of MyError];
是的,这里是忌讳的,但是如果您的站点/项目在整个地方都使用自定义错误,则基本上需要在任何地方或至少在以下地方进行定义:
在全局命名空间中定义我的自定义错误可以免去需要我的客户错误库的麻烦。映像抛出未定义的自定义错误的自定义错误。
同样,如果这是错误的,请让我知道,因为我最近才刚刚开始这样做