Im Knoten können Sie globale Variablen über das Objekt "global" oder "GLOBAL" festlegen:
GLOBAL._ = require('underscore'); // but you "shouldn't" do this! (see note below)
oder nützlicher ...
GLOBAL.window = GLOBAL; // like in the browser
An der Knotenquelle können Sie erkennen, dass diese zueinander ausgerichtet sind:
node-v0.6.6/src/node.js:
28: global = this;
128: global.GLOBAL = global;
Im obigen Code ist "dies" der globale Kontext. Beim commonJS-Modulsystem (welcher Knoten verwendet) ist das "this" -Objekt innerhalb eines Moduls (dh "Ihr Code") NICHT der globale Kontext. Zum Beweis siehe unten, wo ich das "this" -Objekt und dann das riesige "GLOBAL" -Objekt ausspucke.
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: {} }
*/
** Hinweis: In Bezug auf die Einstellung "GLOBAL._" sollten Sie dies im Allgemeinen einfach tun var _ = require('underscore');
. Ja, Sie tun dies in jeder einzelnen Datei, die Unterstriche verwendet, genau wie in Javaimport com.foo.bar;
. Dies macht es einfacher herauszufinden, was Ihr Code tut, da die Verknüpfungen zwischen Dateien "explizit" sind. Leicht nervig, aber eine gute Sache. .... das ist die Predigt.
Zu jeder Regel gibt es eine Ausnahme. Ich hatte genau genau eine Instanz, in der ich "GLOBAL._" setzen musste. Ich habe ein System zum Definieren von "Konfigurations" -Dateien erstellt, die im Grunde JSON waren, aber "in JS geschrieben" wurden, um etwas mehr Flexibilität zu ermöglichen. Solche Konfigurationsdateien hatten keine "require" -Anweisungen, aber ich wollte, dass sie Zugriff auf Unterstriche haben (das GESAMTE System basiert auf Unterstrichen und Unterstrichvorlagen). Bevor ich die "config" auswerte, setzte ich "GLOBAL._". Also ja, für jede Regel gibt es irgendwo eine Ausnahme. Aber du solltest besser einen verdammt guten Grund haben und nicht nur "ich habe es satt, 'require' zu tippen, also möchte ich mit der Konvention brechen".