[Javascript] node.js全局變量?



Answers

在節點中,可以通過“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._”。 我正在創建一個定義“配置”文件的系統,這些文件基本上是JSON,但是“用JS編寫”允許更多的靈活性。 這樣的配置文件沒有'require'語句,但我希望它們可以訪問下劃線(ENTIRE系統以下劃線和下劃線模板為依據),因此在評估“配置”之前,我會設置“GLOBAL._”。 所以,對於每一條規則,都有一個例外。 但你最好有一個很好的理由,而不僅僅是“我厭倦了打字''要求',所以我想打破常規”。

Question

我在這裡問: node.js需要繼承?

並被告知我可以通過忽略var來將變量設置為全局範圍。

這對我不起作用。

即:

_ = require('underscore');

不要在必需的文件中使用_。 我可以用express的app.set來設置它,但它可以在其他地方使用。

有人可以證實,這是應該工作? 謝謝。




你可以使用全局對象。

var X = ['a', 'b', 'c'];
global.x = X;

console.log(x);
//['a', 'b', 'c']



global._ = require('underscore');

請注意,不贊成使用GLOBAL

(node:59502) DeprecationWarning: 'GLOBAL' is deprecated, use 'global'

我的評論:

如果你知道你在做什麼,我認為可以使用全局。 當我每次需要使用圖書館時都需要一些圖書館(並且假設我使用的是數十或數百個文件),我認為這破壞了很多圖書館的要點,並且快速使用。 為什麼它被命名為_ ,而不是amazingLibraryCalledUnderscore

所以對於我來說,需要寫30個字符的var _ = require('underscore'); 比最低要求(1個字符)多3000% 。 是。 編寫代碼時,我著迷於讓我的生活更輕鬆。 我只是討厭重複明顯的事情。 如果我曾經告訴該死的節點我的意思是I want you to know _ means I use underscore我不想再說一遍。

所以 - 我相信當你控制你的代碼時,你應該試著讓它變得性感 。 我相信每次寫30個字都是為了做這麼簡單的事情,真該死!

PS。 當你說I control my code ,要相信你自己,你至少需要有一次失去這種控制的經驗。




Links