Trong nút, bạn có thể đặt các biến toàn cục thông qua đối tượng "toàn cầu" hoặc "TOÀN CẦU":
GLOBAL._ = require('underscore'); // but you "shouldn't" do this! (see note below)
hoặc hữu ích hơn ...
GLOBAL.window = GLOBAL; // like in the browser
Từ nguồn nút, bạn có thể thấy rằng chúng được đặt bí danh cho nhau:
node-v0.6.6/src/node.js:
28: global = this;
128: global.GLOBAL = global;
Trong đoạn mã trên, "cái này" là bối cảnh toàn cầu. Với hệ thống mô-đun commonJS (nút nào sử dụng), đối tượng "này" bên trong mô-đun (nghĩa là "mã của bạn") KHÔNG phải là bối cảnh toàn cầu. Để chứng minh điều này, hãy xem bên dưới nơi tôi phun đối tượng "này" và sau đó là đối tượng "TOÀN CẦU" khổng lồ.
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: {} }
*/
** Lưu ý: liên quan đến cài đặt "GLOBAL._", nói chung bạn chỉ nên làm var _ = require('underscore');
. Có, bạn làm điều đó trong mỗi tệp sử dụng dấu gạch dưới, giống như cách bạn làm trong Java import com.foo.bar;
. Điều này giúp dễ dàng tìm ra mã của bạn đang làm gì vì các liên kết giữa các tệp là 'rõ ràng'. Hơi khó chịu, nhưng là một điều tốt. .... Đó là lời rao giảng.
Có một ngoại lệ cho mọi quy tắc. Tôi đã có chính xác MỘT trường hợp cần thiết để đặt "GLOBAL._". Tôi đã tạo ra một hệ thống để xác định các tệp "cấu hình" về cơ bản là JSON, nhưng được "viết bằng JS" để cho phép linh hoạt hơn một chút. Các tệp cấu hình như vậy không có câu lệnh 'yêu cầu', nhưng tôi muốn chúng có quyền truy cập vào dấu gạch dưới (hệ thống ENTIRE được cung cấp trên các mẫu gạch dưới và gạch dưới), vì vậy trước khi đánh giá "cấu hình", tôi sẽ đặt "GLOBAL._". Vì vậy, yeah, đối với mọi quy tắc, có một ngoại lệ ở đâu đó. Nhưng tốt hơn hết là bạn nên có một lý do chính đáng và không chỉ là "tôi cảm thấy mệt mỏi khi gõ" yêu cầu "nên tôi muốn nghỉ ngơi theo quy ước".