Dalam node, Anda dapat mengatur variabel global melalui objek "global" atau "GLOBAL":
GLOBAL._ = require('underscore'); // but you "shouldn't" do this! (see note below)
atau lebih bermanfaat ...
GLOBAL.window = GLOBAL; // like in the browser
Dari sumber simpul, Anda dapat melihat bahwa ini saling terkait:
node-v0.6.6/src/node.js:
28: global = this;
128: global.GLOBAL = global;
Dalam kode di atas, "ini" adalah konteks global. Dengan sistem modul commonJS (yang menggunakan simpul), objek "ini" di dalam modul (yaitu, "kode Anda") BUKAN konteks global. Untuk buktinya, lihat di bawah ini di mana saya memuntahkan objek "ini" dan kemudian objek "GLOBAL" raksasa.
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: {} }
*/
** Catatan: tentang pengaturan "GLOBAL._", secara umum Anda hanya perlu melakukannya var _ = require('underscore');
. Ya, Anda melakukannya di setiap file yang menggunakan garis bawah, seperti halnya di Java yang Anda lakukanimport com.foo.bar;
. Ini membuatnya lebih mudah untuk mengetahui apa yang kode Anda lakukan karena hubungan antar file bersifat 'eksplisit'. Agak menyebalkan, tapi bagus. .... Itulah khotbahnya.
Ada pengecualian untuk setiap aturan. Saya memiliki persis satu contoh di mana saya perlu mengatur "GLOBAL._". Saya sedang membuat sistem untuk mendefinisikan "config" file yang pada dasarnya JSON, tetapi "ditulis dalam JS" untuk memungkinkan fleksibilitas yang sedikit lebih. File konfigurasi seperti itu tidak memiliki pernyataan 'wajib', tapi saya ingin mereka memiliki akses ke garis bawah (sistem SELURUH didasarkan pada template garis bawah dan garis bawah), jadi sebelum mengevaluasi "konfigurasi", saya akan menetapkan "GLOBAL._". Jadi ya, untuk setiap aturan, ada pengecualian di suatu tempat. Tetapi Anda sebaiknya memiliki alasan yang sangat bagus dan bukan hanya "saya bosan mengetik 'wajib' jadi saya ingin istirahat dengan konvensi".